結果
問題 | No.599 回文かい |
ユーザー |
|
提出日時 | 2021-10-18 12:57:19 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 148 ms / 4,000 ms |
コード長 | 4,475 bytes |
コンパイル時間 | 2,142 ms |
コンパイル使用メモリ | 198,192 KB |
最終ジャッジ日時 | 2025-01-25 01:48:18 |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define rep(i,n) for(ll i=0;i<n;i++)#define repl(i,l,r) for(ll i=(l);i<(r);i++)#define per(i,n) for(ll i=(n)-1;i>=0;i--)#define perl(i,r,l) for(ll i=r-1;i>=l;i--)#define fi first#define se second#define pb push_back#define ins insert#define pqueue(x) priority_queue<x,vector<x>,greater<x>>#define all(x) (x).begin(),(x).end()#define CST(x) cout<<fixed<<setprecision(x)#define vtpl(x,y,z) vector<tuple<x,y,z>>#define rev(x) reverse(x);using ll=long long;using vl=vector<ll>;using vvl=vector<vector<ll>>;using pl=pair<ll,ll>;using vpl=vector<pl>;using vvpl=vector<vpl>;const ll MOD=1000000007;const ll MOD9=998244353;const int inf=1e9+10;const ll INF=4e18;const ll dy[9]={0,1,-1,0,1,1,-1,-1,0};const ll dx[9]={1,0,0,-1,1,-1,1,-1,0};template<class T> inline bool chmin(T& a, T b) {if (a > b) {a = b;return true;}return false;}template<class T> inline bool chmax(T& a, T b) {if (a < b) {a = b;return true;}return false;}const int mod = 1000000007;const int max_n = 200005;struct mint {ll x; // typedef long long ll;mint(ll 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 { return mint(*this) += a;}mint operator-(const mint a) const { return mint(*this) -= a;}mint operator*(const mint a) const { return mint(*this) *= a;}mint pow(ll t) const {if (!t) return 1;mint a = pow(t>>1);a *= a;if (t&1) a *= *this;return a;}bool operator==(const mint &p) const { return x == p.x; }bool operator!=(const mint &p) const { return x != p.x; }// for prime modmint inv() const { return pow(mod-2);}mint& operator/=(const mint a) { return *this *= a.inv();}mint operator/(const mint a) const { return mint(*this) /= a;}};istream& operator>>(istream& is, mint& a) { return is >> a.x;}ostream& operator<<(ostream& os, const mint& a) { return os << a.x;}using vm=vector<mint>;using vvm=vector<vm>;struct RollingHash {static const int base1 = 1007, base2 = 2009;static const int mod1 = 1000000007, mod2 = 1000000009;vector<long long> hash1, hash2, power1, power2;// constructRollingHash(const string &S) {int n = (int)S.size();hash1.assign(n+1, 0);hash2.assign(n+1, 0);power1.assign(n+1, 1);power2.assign(n+1, 1);for (int i = 0; i < n; ++i) {hash1[i+1] = (hash1[i] * base1 + S[i]) % mod1;hash2[i+1] = (hash2[i] * base2 + S[i]) % mod2;power1[i+1] = (power1[i] * base1) % mod1;power2[i+1] = (power2[i] * base2) % mod2;}}// get hash of S[left:right)inline pair<long long, long long> get(int l, int r) const {long long res1 = hash1[r] - hash1[l] * power1[r-l] % mod1;if (res1 < 0) res1 += mod1;long long res2 = hash2[r] - hash2[l] * power2[r-l] % mod2;if (res2 < 0) res2 += mod2;return {res1, res2};}using pl=pair<long long,long long>;inline pl connect(pl h1,pl h2,int h2len){pl ret;ret.first=(h1.first*power1[h2len]+h2.first)%mod1;ret.second=(h1.second*power2[h2len]+h2.second)%mod2;return ret;}// get lcp of S[a:] and T[b:]inline int getLCP(int a, int b) const {int len = min((int)hash1.size()-a, (int)hash1.size()-b);int low = 0, high = len;while (high - low > 1) {int mid = (low + high) >> 1;if (get(a, a+mid) != get(b, b+mid)) high = mid;else low = mid;}return low;}};ll seen[5010];mint memo[5010];ll n;mint solve(ll l,RollingHash &rh){//lから始まるif(seen[l])return memo[l];mint ans=1;for(int i=1;;i++){ll right=l+i;//[l,l+i)ll left=n-i-l;//[n-l-i,n-l)if(left<right)break;if(rh.get(l,l+i)==rh.get(n-l-i,n-l)){ans+=solve(l+i,rh);}}seen[l]=1;memo[l]=ans;return ans;}int main(){string s;cin >> s;RollingHash rh(s);rep(i,5010)seen[i]=0;n=s.size();cout << solve(0,rh) << endl;}