您的位置:首页 > 其它

【BZOJ】3670 [Noi2014]动物园 KMP

2017-04-18 20:19 399 查看
题目传送门

这题的正解就写在了题目里——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的心得:以后做题前一定要调整好自己的状态,不要在做题时在浑浑噩噩,不知所措
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: