結果
問題 | No.599 回文かい |
ユーザー |
![]() |
提出日時 | 2022-09-30 20:18:14 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 626 ms / 4,000 ms |
コード長 | 3,916 bytes |
コンパイル時間 | 3,064 ms |
コンパイル使用メモリ | 253,912 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-12-22 20:37:42 |
合計ジャッジ時間 | 5,394 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;using ull = unsigned long long;using ld = long double;template<class t> using vc = vector<t>;template<class t> using vvc = vc<vc<t>>;using pi = pair<int,int>;using pl = pair<ll,ll>;using vi = vc<int>;using vvi = vvc<int>;using vl = vc<ll>;using vvl = vvc<ll>;#define rep(i,a,b) for (int i = (int)(a); i < (int)(b); i++)#define irep(i,a,b) for (int i = (int)(a); i > (int)(b); i--)#define all(a) a.begin(),a.end()#define print(n) cout << n << '\n'#define pritn(n) print(n)#define printv(n,a) {copy(all(n),ostream_iterator<a>(cout," ")); cout<<"\n";}#define printvv(n,a) {for(auto itr:n) printv(itr,a);}#define rup(a,b) (a+b-1)/b#define input(A,N) rep(i,0,N) cin>>A[i]#define chmax(a,b) a = max(a,b)#define chmin(a,b) a = min(a,b)//const int mod = 998'244'353;//const ll mod = 1'000'000'009;//const ll mod = 67'280'421'310'721;template< ll mod >struct mint{long long x;mint(long long x=0):x((x%mod+mod)%mod){}mint operator-() const{return mint(-x);}mint& operator+=(const mint& a){if((x+=a.x)>=mod)x-=mod;return *this;}mint& operator-=(const mint& a){if((x+=mod-a.x)>=mod)x-=mod;return *this;}mint& operator*=(const mint& a){(x *= a.x) %= mod;return *this;}mint operator+(const mint& a) const{mint res(*this);return res+=a;}mint operator-(const mint& a) const{mint res(*this);return res-=a;}mint operator*(const mint& a) const{mint res(*this);return res*=a;}mint pow(long long n) const {assert(0 <= n);mint a = *this, r = 1;while (n) {if (n & 1) r *= a;a *= a;n >>= 1;}return r;}mint inv() const{return pow(mod-2);}mint& operator/=(const mint& a){return (*this)*=a.inv();}mint operator/(const mint& a) const {mint res(*this);return res/=a;}friend ostream& operator<<(ostream& os, const mint& m){os << m.x;return os;}bool operator==(const mint& a) const {return x == a.x;}bool operator<(const mint& a) const{return x < a.x;}};//https://gist.github.com/privet-kitty/295ac9202b7abb3039b493f8238bf40f#file-modulus-random-base-pair64-txtstruct rhash{int n;ll mod,B;vc<ll> sum;vc<ll> powb;rhash(string &s,ll mod,ll B):mod(mod),B(B){n = s.size();sum = vc<ll>(n+1,0);powb = vc<ll>(n+1,1);for(int i = 0;i<n;i++){sum[i+1] = (sum[i]*B%mod+(s[i]-'0'))%mod;powb[i+1] = (powb[i]*B)%mod;}}ll get(int l,int r){ll tmp = sum[r] - sum[l]*powb[r-l]%mod;if(tmp<0) tmp += mod;return tmp;}};const ll m1 = 1'000'000'007;mint<m1> dfs(int l,int r,vi&vis,vc<rhash>&hash,vc<mint<m1>>&dp){if(r<=l) return mint<m1>(1);if(vis[l])return dp[l];int L = l,R = r;while(L<R){bool p = true;rep(i,0,hash.size()){if(hash[i].get(l,L+1)==hash[i].get(R,r+1)) continue;p = false;break;}if(p){dp[l] += dfs(L+1,R-1,vis,hash,dp);}L++;R--;}vis[l] = 1;return dp[l];}const ll m4 = 2147483587;const ll b4 = 2147483583;const ll b2 = 1009;const ll b3 = 2009;const ll m2 = 1000000007;const ll m3 = 1000000009;int main(){cout << fixed << setprecision(15);string s;cin>>s;int n = s.size();vc<rhash> hash;hash.push_back(rhash(s,m2,b2));hash.push_back(rhash(s,m3,b3));// hash.push_back(rhash(s,m4,b4));vc<mint<m1>> dp(n,1);vi vis(n,0);print(dfs(0,n-1,vis,hash,dp));//system("pause");return 0;}