求调 KMP
查看原帖
求调 KMP
822239
ncwzdlsd楼主2023/2/13 15:11
#include<bits/stdc++.h>
using namespace std;

const int mod=1e9+7;
int n,nxt[1000005],num[1000005],ans;
char a[1000005];

int main()
{
    int nn;cin>>nn;
    while(nn--)
    {
        scanf("%s",a+1);n=strlen(a+1);
        num[0]=0;num[1]=1;
        for(int i=1,j=0;i<=n;i++)
        {
            while(j&&(a[i+1]!=a[j+1])) j=nxt[j];
            if(a[i+1]==a[j+1]) j++;
            nxt[i+1]=j;num[i+1]=num[j]+1;
        }
        ans=1;
        for(int i=1,j=0;i<=n;i++)
        {
            while(j&&(a[i+1]!=a[j+1])) j=nxt[j];
            if(a[i+1]==a[j+1]) j++;
            while((j<<1)>i+1) j=nxt[j];
            ans=(ans*(num[j]+1))%mod;
        }
		cout<<ans<<endl;
    }
    return 0;
}
2023/2/13 15:11
加载中...