結果
| 問題 |
No.599 回文かい
|
| コンテスト | |
| ユーザー |
Manuel1024
|
| 提出日時 | 2021-11-07 15:39:52 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2,076 ms / 4,000 ms |
| コード長 | 1,955 bytes |
| コンパイル時間 | 1,097 ms |
| コンパイル使用メモリ | 87,612 KB |
| 実行使用メモリ | 199,936 KB |
| 最終ジャッジ日時 | 2024-11-14 01:38:12 |
| 合計ジャッジ時間 | 6,707 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 22 |
ソースコード
#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
using ll = long long int;
using P = pair<int, 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;
map<P, ll> dp2;
Solver(string &s): s(s)
//dp(vector<vector<ll>>(s.size(), vector<ll>(s.size(), -1)))
{
int l = s.size();
for(int i = 0; l-i*2 > 0; i++){
mem.emplace_back(vector<int>(s.size()));
// 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];
if(dp2.count(make_pair(start, end))) return dp2[make_pair(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;
dp2[make_pair(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