这题的正解就写在了题目里——KMP。(NOI的题目有这么好心吗?)
对于每个字符串,我们先求出next数组,也就是失配函数,并记录当前状态经过几次pre=next[pre]会使pre==0,也就是num数组的雏形。
然后再做一遍类似于求next数组的循环,并while(pre*2>i) pre=next[pre],然后就是统计答案咯。
由于今天不知中了什么毒,可能是天气太热,我一直处于智商为0的状态,把while(pre*2>i) pre=next[pre]一直打成while(c[pre]*2>i) pre=next[pre](c数组就是经过几次pre=next[pre]会使pre==0),WA了将近15次……
附上AC代码:
#include <cstdio>
#include <iostream>
using namespace std;
long long ans;
int nt[1000010],c[1000010],t,pre;
char s[1000010];
int main(void){
for (scanf("%d",&t); t; t--){
scanf("%s",s+1),c[1]=1,pre=0;
for (int i=2; s[i]; ++i){
while (pre&&s[pre+1]!=s[i]) pre=nt[pre];
if (s[pre+1]==s[i]) ++pre;
nt[i]=pre,c[i]=c[pre]+1;
}
ans=1,pre=0;
for (int i=2; s[i]; ++i){
while (pre&&s[pre+1]!=s[i]) pre=nt[pre];
if (s[pre+1]==s[i]) ++pre;
while ((pre<<1)>i) pre=nt[pre];
ans*=pre+1,ans%=1000000007;
}
printf("%lld\n",ans);
}
return 0;
}
WA的心得:以后做题前一定要调整好自己的状态,不要在做题时在浑浑噩噩,不知所措