提交时间:2025-06-27 13:54:07

运行 ID: 38199

#include<bits/stdc++.h> using namespace std; const int N=2e5+10,mod=1e9+7; int sa[N],rk[N<<1],ht[N]; string s;int n; int p[N],v[N]; void gsa(){ for(int i=1;i<=n;i++) rk[i]=s[i]-'a'; for(int j=0;(1<<j)<=n;j++){ auto cmp=[&](int a,int b){ if(rk[a]==rk[b]) return rk[a+(1<<j)]<rk[b+(1<<j)]; return rk[a]<rk[b]; }; for(int i=1;i<=n;i++) p[i]=i; sort(p+1,p+n+1,cmp); v[1]=1;int nrk=0; for(int i=2;i<=n;i++) v[i]=cmp(p[i-1],p[i]); for(int i=1;i<=n;i++){ nrk+=v[i];rk[p[i]]=nrk; } }for(int i=1;i<=n;i++) sa[rk[i]]=i; int len=0; for(int i=1;i<=n;i++){ if(len) len--; if(rk[i]==1) continue; int pos=sa[rk[i]-1]; for(;s[pos+len]==s[i+len];len++); ht[rk[i]]=len; } } int mn[5050][5050]; int lcp(int a,int b){ int l=rk[a],r=rk[b]; if(l>r) swap(l,r); int ans=mn[l+1][r]; //for(int i=l+1;i<=r;i++) // ans=min(ans,ht[i]); return ans; } int ans[N]; int main(){ cin>>n;cin>>s; reverse(s.begin(),s.end()); s=' '+s+' ';gsa(); //for(int i=1;i<=n;i++) cout<<rk[i]<<' ';cout<<endl; for(int i=n;i>=1;i--){ mn[i][i]=ht[i]; for(int j=i+1;j<=n;j++){ mn[i][j]=min(mn[i+1][j],mn[i][j-1]); } } for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ int x=lcp(i,j); //if(i==4) cout<<i<<' '<<j<<' '<<x<<endl; ans[i]=(ans[i]+x)%mod; } } for(int i=n;i>=1;i--) ans[i]=(ans[i]+ans[i+1])%mod; for(int i=n;i>=1;i--) ans[i]=(ans[i]+ans[i+1])%mod; for(int i=n;i>=1;i--) cout<<ans[i]<<endl; return 0; }