結果
| 問題 |
No.599 回文かい
|
| コンテスト | |
| ユーザー |
Manuel1024
|
| 提出日時 | 2021-11-07 15:35:26 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,764 bytes |
| コンパイル時間 | 830 ms |
| コンパイル使用メモリ | 79,380 KB |
| 実行使用メモリ | 814,848 KB |
| 最終ジャッジ日時 | 2024-11-14 01:28:12 |
| 合計ジャッジ時間 | 8,430 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 13 MLE * 9 |
ソースコード
#include <iostream>
#include <vector>
#include <string>
using namespace std;
using ll = long long int;
constexpr ll MOD = 1'000'000'007;
vector<int> Z_Algorithm(const string &s){
vector<int> a(s.size());
a[0] = s.size();
int i = 1, j = 0;
while(i < s.size()){
while(i+j < s.size() && s[j] == s[i+j]) ++j;
a[i] = j;
if(j == 0){
++i; continue;
}
int k = 1;
while(i+k < s.size() && k+a[k] < j){
a[i+k] = a[k], ++k;
}
i += k; j -= k;
}
return a;
}
struct Solver{
const string s;
vector<vector<int>> mem;
vector<vector<ll>> dp;
Solver(string &s): s(s), mem(vector<vector<int>>(s.size(), vector<int>(s.size()))),
dp(vector<vector<ll>>(s.size(), vector<ll>(s.size(), -1))){
int l = s.size();
for(int i = 0; l-i*2 > 0; i++){
// cerr << s.substr(i, l-i*2) << endl;
auto vec = Z_Algorithm(s.substr(i, l-i*2));
for(int j = 0; j < vec.size(); j++){
mem[i][i+j] = vec[j];
}
}
}
ll f(int start, int end){
if(dp[start][end] != -1) return dp[start][end];
ll ans = 1;
for(int i = 0; i+start < end-i; i++){
if(mem[start][end-i] == i+1){
ans += f(start+i+1, end-i-1);
ans %= MOD;
}
}
// for(int i = 0; i < s.size(); i++) cerr << mem[start][i] << " ";
// cerr << endl;
// cerr << start << " " << end << " " << ans << endl;
dp[start][end] = ans;
return ans;
}
void solve(){
cout << f(0, s.size()-1) << endl;
}
};
int main(){
string s;
cin >> s;
Solver sol(s);
sol.solve();
return 0;
}
Manuel1024