因为有一个限制,我们不能简单的处理; 首先,当i满足限制条件时,对于i+1,我们如果用i的限制条件去更新i+1,那么i+1会有错误; 所以我们要先跑一边无限制的kmp,然后再去求出限制的kmp; 限制有两种; 一是限制next数组(p[]) 一是限制sum数组; 这个见代码,都是大神帮我调的5555; 还有我的kmp要预处理i=1的情况; 这个好麻烦;
/*#include#include #include #define Ll long longusing namespace std;char s[2000001];Ll p[1000005],sum[1000005],P[1000005];Ll n,m,ans,mo=1000000007;void make(char s[]){ p[1]=0;sum[1]=1; for(int i=2;i<=m;i++){ int j=p[i-1]; while(j&&s[j+1]!=s[i])j=p[j]; p[i]=j;sum[i]=sum[j]+1; // cout< <<' '< < i)||(j&&s[j+1]!=s[i]))j=p[j]; if(s[j+1]==s[i])j++; P[i]=sum[j]; }}int main(){ scanf("%lld",&n); while(n--){ scanf("%s",s+1);m=strlen(s+1); make(s); make2(s); ans=1; for(int i=1;i<=m;i++)ans=ans*(P[i]+1)%mo; printf("%lld\n",ans); }}*/#include #include #include #define Ll long longusing namespace std;char s[2000001];Ll p[1000005],sum[1000005],P[1000005];Ll n,m,ans,mo=1000000007;void make(char s[]){ p[1]=0;sum[1]=1; for(int i=2;i<=m;i++){ int j=p[i-1]; while(j&&s[j+1]!=s[i])j=p[j]; if(s[j+1]==s[i])j++; p[i]=j;sum[i]=sum[j]+1; }}void make2(char s[]){ P[1]=0; int j=0; for(int i=2;i<=m;i++){ if(j*2+2>i)j=p[j]; while(j&&s[j+1]!=s[i])j=p[j]; if(s[j+1]==s[i])j++; P[i]=sum[j]; }}/*void make2(char s[]){ P[1]=0; for(int i=2;i<=m;i++){ int j=P[i-1]; if(j*2+2>i)j=p[j]; while(j&&s[j+1]!=s[i])j=p[j]; if(s[j+1]==s[i])j++; P[i]=j; }}*/int main(){ scanf("%lld",&n); while(n--){ scanf("%s",s+1);m=strlen(s+1); make(s); make2(s); ans=1; for(int i=1;i<=m;i++)ans=ans*(P[i]+1)%mo; /*for(int i=1;i<=m;i++)ans=ans*(sum[P[i]]+1)%mo;*/ printf("%lld\n",ans); }}