题意自己看。。
kmp搞搞就好了。。
要分两次搞,不然会T。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,nxt[1000010],num[1000010],mod=1000000007;
char s[1000010];
long long ans;
int main()
{
scanf("%d",&n);
while(n--)
{
ans=1;
scanf("%s",s+1);
int len=strlen(s+1);
nxt[1]=0;
num[1]=1;
for(int i=2;i<=len;i++)
{
int j=nxt[i-1];
while(j&&s[j+1]!=s[i])
j=nxt[j];
if(s[j+1]==s[i])
j++;
nxt[i]=j;
num[i]=num[j]+1;
}
int j=0;
for(int i=2;i<=len;i++)
{
while(j&&s[j+1]!=s[i])
j=nxt[j];
if(s[j+1]==s[i])
j++;
while((j<<1)>i)
j=nxt[j];
ans=ans*(num[j]+1)%mod;
}
printf("%lld\n",ans);
}
}

本文介绍了一种使用KMP算法处理字符串匹配问题的方法。通过两次KMP过程,有效地避免了超时问题,确保了算法效率。文章提供了完整的C++实现代码,并详细解释了如何构建next数组及如何利用该数组进行高效匹配。
447

被折叠的 条评论
为什么被折叠?



