結果
問題 | No.599 回文かい |
ユーザー |
|
提出日時 | 2017-11-25 01:29:31 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 209 ms / 4,000 ms |
コード長 | 2,396 bytes |
コンパイル時間 | 808 ms |
コンパイル使用メモリ | 95,736 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-27 09:00:14 |
合計ジャッジ時間 | 2,156 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<ctime>#include<cctype>#include<climits>#include<iostream>#include<string>#include<vector>#include<map>#include<list>#include<queue>#include<deque>#include<algorithm>#include<numeric>#include<utility>#include<complex>#include<memory>#include<functional>#include<set>using namespace std;#define ALL(g) (g).begin(),(g).end()#define REP(i, x, n) for(int i = x; i < n; i++)#define rep(i,n) REP(i,0,n)#define P(p) cout<<(p)<<endl;#define p(p) cout<<(p)<<" ";#define pb push_back#define mp make_pair#define INF 1<<25typedef vector<int> vi;typedef vector<vi> vvi;typedef vector<string> vs;typedef pair<int, int> pi;typedef long long ll;//int dy[8]={1,1,1,0,0,-1,-1,-1};//int dx[8]={-1,0,1,-1,1,-1,0,1};int dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};struct S{int a,b,c;};bool asc(const S& left,const S& right){return left.c > right.c;}struct RollingHash {static const ll mo0=1000000007,mo1=1000000009;static ll mul0,mul1;static const ll add0=1000010007, add1=1003333331;static vector<ll> pmo[2];string s; int l; vector<ll> hash_[2];void init(string s) {this->s=s; l=s.size(); int i,j;hash_[0]=hash_[1]=vector<ll>(1,0);if(!mul0) mul0=10009+(((ll)&mul0)>>5)%259,mul1=10007+(((ll)&mul1)>>5)%257;if(pmo[0].empty()) pmo[0].push_back(1),pmo[1].push_back(1);rep(i,l) hash_[0].push_back((hash_[0].back()*mul0+add0+s[i])%mo0);rep(i,l) hash_[1].push_back((hash_[1].back()*mul1+add1+s[i])%mo1);}/*以下ll版*/ll hash(int l,int r) { // s[l..r]if(l>r) return 0;while(pmo[0].size()<r+2)pmo[0].push_back(pmo[0].back()*mul0%mo0), pmo[1].push_back(pmo[1].back()*mul1%mo1);return (((hash_[0][r+1]+(mo0-hash_[0][l]*pmo[0][r+1-l]%mo0))%mo0)<<32) |((hash_[1][r+1]+(mo1-hash_[1][l]*pmo[1][r+1-l]%mo1))%mo1);}ll hash(string s) { init(s); return hash(0,s.size()-1); }};vector<ll> RollingHash::pmo[2]; ll RollingHash::mul0,RollingHash::mul1;int N;string S;ll mo=1000000007;RollingHash rh;void input(){cin>>S;}int main(){cin.tie(0);ios::sync_with_stdio(false);input();N=S.size();rh.init(S);vector<ll> dp(N+1,0);ll ans=1;dp[0]=1;REP(i,1,N/2+1){rep(j,i){if(!dp[j])continue;if(rh.hash(j,i-1)==rh.hash(N-i,N-j-1)){dp[i]+=dp[j];}}dp[i]%=mo;ans+=dp[i];}P(ans%mo)return 0;}