BZOJ3670: [Noi2014]动物园(洛谷P2375)
2018-03-05 21:03
357 查看
KMP
BZOJ题目传送门洛谷题目传送门
感觉洛谷标签高了点啊。。。
第一遍处理出next数组,另记一个数组干脆就叫 num表示题目中的num的可重叠版(就是前后缀可重叠的数量)。再类似求next一样跳一遍,加上限制后统计答案就好了。
我之前从0开始的KMP简直有毒
代码:
#include<cstdio> #include<cstring> #include<algorithm> #define N 1000005 using namespace std; const int MOD=1e9+7; int t,n,nxt ,num ; char s ; int main(){ for (scanf("%d",&t);t;t--){ memset(nxt,0,sizeof(nxt)); memset(num,0,sizeof(num)); scanf("%s",s+1),num[1]=1; for (int i=2,nd=0;s[i];nxt[i++]=nd){ while (nd&&s[nd+1]!=s[i]) nd=nxt[nd]; if (s[nd+1]==s[i]) nd++; num[i]=num[nd]+1; } long long ans=1; for (int i=2,nd=0;s[i];i++){ while (nd&&s[nd+1]!=s[i]) nd=nxt[nd]; if (s[nd+1]==s[i]) nd++; while ((nd<<1)>i) nd=nxt[nd];//跳到长度<=i/2为止 (ans*=num[nd]+1)%=MOD; } printf("%lld\n",ans); } return 0; }
相关文章推荐
- BZOJ3670(Noi2014)[动物园]--KMP
- BZOJ3670: [Noi2014]动物园
- [KMP fail树] BZOJ3670: [Noi2014]动物园
- bzoj3670:NOI2014 动物园
- BZOJ3670: [Noi2014]动物园
- BZOJ3670: [Noi2014]动物园(DP)
- bzoj3670【NOI2014】动物园
- bzoj3670 [Noi2014]动物园 kmp
- BZOJ3670 [Noi2014]动物园 解题报告【字符串】【KMP】
- 【NOI2014】动物园
- bzoj 3670: [Noi2014]动物园
- BZOJ_3670_[Noi2014]动物园_KMP
- 【NOI2014】动物园 kmp
- 【bzoj3670】[Noi2014]动物园 KMP
- 字符串(KMP):BZOJ 3670 [Noi2014]动物园
- uoj #5. 【NOI2014】动物园
- NOI2014 动物园
- Bzoj3670: [Noi2014]动物园
- UOJ #5 [NOI2014 D2T1] 动物园
- bzoj 3670: [Noi2014]动物园