http://www.lydsy.com/JudgeOnline/problem.php?id=3670
https://www.luogu.org/problem/show?pid=2375
洛谷有分点信息真好。。。(用多了不好不利于自身提高)
标算Kmp,第一次写渣了BZOJ只有提示WA洛谷一测爆蛋
这题的主要坑点在于限制后缀与前缀不重叠,其他和普通的Kmp并没有什么本质区别
这个其实只要加一个限制条件判断一下就好了
还有一个坑点,处理限制重叠要与原来的分开做,否则变量指针j会出问题
意思就是说要分两个循环,我一开始一个循环就炸了
还有一个坑点,题目里面说要求这样的前缀有多少,我一开始看成了求最大前缀QAQ
所以还要再多开一个数组num。。。
还有一个坑点……
反正处处是坑
#include<bits/stdc++.h>
using namespace std;
int nex[1000001],l1,num[1000001]={0};
char a[1000001];
int main()
{
long long ans;
int n;scanf("%d",&n);
while(n--){
scanf("%s",a+1);
l1=strlen(a+1);
int j=0;long long ans=1;
memset(num,0,sizeof num);
num[1]=1;ans=1;
for(int i=2;i<=l1;i++){
while(j&&a[i]!=a[j+1])j=nex[j];
if(a[i]==a[j+1])j++;
nex[i]=j;num[i]=num[j]+1;
}
j=0;
for(int i=2;i<=l1;i++){
while(j&&a[i]!=a[j+1])j=nex[j];
if(a[i]==a[j+1])j++;
while(j&&j>i/2)j=nex[j];
ans=ans*(num[j]+1)%1000000007;
}
printf("%lld\n",ans);
}
return 0;
}