結果
問題 | No.599 回文かい |
ユーザー |
![]() |
提出日時 | 2019-08-15 10:04:18 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 1,178 ms / 4,000 ms |
コード長 | 2,284 bytes |
コンパイル時間 | 1,461 ms |
コンパイル使用メモリ | 169,232 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-19 14:59:23 |
合計ジャッジ時間 | 5,677 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define int long long#define rep(i,l,r) for(int i=(int)(l);i<(int)(r);i++)#define all(x) (x).begin(),(x).end()template<class T>bool chmax(T &a,T b){if(a<b){a=b;return 1;}return 0;}template<class T>bool chmin(T &a,T b){if(a>b){a=b;return 1;}return 0;}typedef pair<int, int> pii;typedef vector<int> vi;typedef vector<vi> vvi;const int inf = 1LL<<60;const int mod = 1e9 + 7;const double eps = 1e-9;/*{}*/template<typename T>class RollingHash{public:const int K = 2;int N;vector<T> M, B;vector<vector<T>> hash, p;RollingHash(){}RollingHash(const string &s, vector<T> b={107,311}){init(s, b);}void init(const string &s,vector<T> b={107, 311},vector<T> m={1000000007, 1000000009}){M = m; B = b;hash.resize(K); p.resize(K);N = s.size();for(int i = 0; i < K; i++){hash[i].assign(N+1, 0);p[i].assign(N+1, 1);for(int j = 0; j < N; j++){hash[i][j+1] = (hash[i][j]*B[i] + s[j])%M[i];p[i][j+1] = p[i][j]*B[i]%M[i];}}}void add(const string &s){int m = s.size();for(int i = 0; i < K; i++){hash[i].resize(N+m+1, 0);p[i].resize(N+m+1, 1);for(int j = 0; j < m; j++){hash[i][N+j+1] = (hash[i][N+j]*B[i] + s[j])%M[i];p[i][N+j+1] = p[i][N+j]*B[i]%M[i];}}N += m;}vector<T> find(int l, int r){vector<T> res(K);for(int i = 0; i < K; i++){T tmp = hash[i][r] + M[i] - hash[i][l]*p[i][r-l]%M[i];res[i] = tmp >= M[i] ? tmp-M[i] : tmp;}return res;}};int memo[10000];bool vis[10000];RollingHash<int> rh;int dfs(int L, int R){if(R < L) return 1;if(vis[L]) return memo[L];int res = 1;int l = L, r = R;while(l < r){if(rh.find(L, l+1) == rh.find(r, R+1)){(res += dfs(l+1, r-1)) %= mod;}l++; r--;}vis[L] = true;return memo[L] = res;}signed main(){srand((unsigned)time(NULL));int B1 = rand()%10000+100000;int B2 = rand()%10000+500000;string s;cin >> s;int n = s.size();rh.init(s, {B1, B2});cout << dfs(0, n-1) << endl;return 0;}