【BZOJ】3670 [Noi2014]动物园 KMP

110 篇文章 0 订阅
6 篇文章 0 订阅

题目传送门

这题的正解就写在了题目里——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的心得:以后做题前一定要调整好自己的状态,不要在做题时在浑浑噩噩,不知所措
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值