【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代码:
这题的正解就写在了题目里——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的心得:以后做题前一定要调整好自己的状态,不要在做题时在浑浑噩噩,不知所措
相关文章推荐
- BZOJ 3670: [Noi2014]动物园 KMP
- 【bzoj3670】【NOI2014】【动物园】【kmp+dp】
- 【bzoj 3670】 [Noi2014]动物园 KMP变式
- [NOI2014][bzoj3670] 动物园 [kmp+next数组应用]
- BZOJ 3670 NOI 2014 动物园 变形KMP
- BZOJ 3670 [Noi2014]动物园 (KMP next数组应用)
- BZOJ_3670_[NOI2014]_动物园_(kmp)
- bzoj 3670: [Noi2014]动物园 KMP
- 【BZOJ3670】【NOI2014】动物园 KMP变形 线性出解
- [BZOJ3670][Noi2014]动物园 && KMP
- 【BZOJ3670】【NOI2014】动物园 [KMP][倍增]
- 【KMP,next树】BZOJ3670 [Noi2014]动物园
- 【bzoj3670】[Noi2014]动物园 KMP
- 【BZOJ3670】【NOI 2014】动物园(KMP)
- BZOJ 3670([Noi2014]动物园-kmp变形)
- BZOJ 3670: [Noi2014]动物园 [KMP]
- BZOJ_3670_[Noi2014]动物园_KMP
- BZOJ3670 [Noi2014]动物园 【KMP计数】
- [KMP next树] BZOJ 3670 [Noi2014]动物园
- bzoj3670: [Noi2014]动物园 KMP