1 solutions
-
0
#include <bits/stdc++.h> using namespace std; const int N=1e6+5; const int p=998244353; typedef long long ll; typedef unsigned long long ull; const int M=2; const ull B=233,mod[M]={1000000009,1000000901}; ull pw[M][N]; void init() { for(int j=0;j<M;++j) { pw[j][0]=1; for(int i=1;i<N;++i) pw[j][i]=pw[j][i-1]*B%mod[j]; } } // h[i]表示s_{0,1,...,i-1}的哈希值 void initHash(string &s,vector<vector<int>> &h) { h.resize(M); for(int j=0;j<M;++j) { h[j].resize(s.size()+1); h[j][0]=0; for(int i=0;i<(int)s.size();++i) h[j][i+1]=(h[j][i]*B+s[i]-'a'+1)%mod[j]; } } array<ull,M> subHash(vector<vector<int>> &h,int l,int r) { array<ull,M> res; for(int i=0;i<M;++i) res[i]=(h[i][r]+mod[i]-h[i][l-1]*pw[i][r-l+1]%mod[i])%mod[i]; return res; } string s,t; vector<vector<int>> hs,ht; int lcp[N]; ll f[N][3],diff[N][3]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); init(); cin>>s>>t; initHash(s,hs),initHash(t,ht); int n=(int)s.size(),m=(int)t.size(); for(int i=1;i<=n;i++) { int ans=0,mid,l=1,r=min(m,n-i+1); while(l<=r) { mid=(l+r)>>1; if(subHash(hs,i,i+mid-1)==subHash(ht,1,mid)) { ans=mid; l=mid+1; } else r=mid-1; } lcp[i]=ans; if(lcp[i]==min(n-i+1,m)) continue; ans=0,l=1,r=min(m,n-i+1)-lcp[i]-1; while(l<=r) { mid=(l+r)>>1; if(subHash(hs,i+lcp[i]+1,i+mid+lcp[i])==subHash(ht,1+lcp[i]+1,mid+lcp[i]+1)) { ans=mid; l=mid+1; } else r=mid-1; } lcp[i]+=ans+1; } f[n+1][0]=1; for(int i=n;i;i--) { int l=i+1,r=i+lcp[i]; f[i][0]=(f[l][0]-f[r+1][0]+p)%p; f[i][1]=((f[l][1]-f[r+1][1]+p)+(f[l][0]-f[r+1][0]+p))%p; f[i][2]=((f[l][2]-f[r+1][2]+p)+2*(f[l][1]-f[r+1][1]+p)+(f[l][0]-f[r+1][0]+p))%p; f[i][0]=(f[i][0]+f[i+1][0])%p; f[i][1]=(f[i][1]+f[i+1][1])%p; f[i][2]=(f[i][2]+f[i+1][2])%p; } cout<<(f[1][2]-f[2][2]+p)%p<<'\n'; return 0; }
- 1
Information
- ID
- 9312
- Time
- 6000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- # Submissions
- 23
- Accepted
- 1
- Uploaded By