bzoj 3670 动物园 KMP
来源:互联网 发布:自身投资知乎 编辑:程序博客网 时间:2024/05/21 09:46
KMP非常神,我们可以顺着fail数组把一个字符串所有前缀等于后缀的子串跑一边,而且顺序是从大到小。例如ababcccabab,fail11=4,fail4=2,fail2=0;对于这道题来说,我们可以顺着每一位的fail跑一遍(当然会T)求num数组,但是我们只要求出跑了多少次后,fail值等于0就可以了,上例sum[11]=sum[4]+1,sum在初始化的时候求出来。统计答案的时候,num[i]=sum[j],j是顺着fail数组跑,长度<=(i/2)的第一个值;
#include<iostream>#include<cstdio>#include<cstring>#define LL long longusing namespace std;char s2[1000005];LL fail[1000005];LL sum[1000005];LL num[1000005];void init(int m){ fail[0]=0;fail[1]=0; sum[0]=0;sum[1]=1; for(int i=2;i<=m;i++) { int p=fail[i-1]; while(p&&s2[i]!=s2[p+1])p=fail[p]; if(s2[p+1]==s2[i]) p++; fail[i]=p; sum[i]=sum[p]+1; }}void get(int m){ int p=0;num[0]=0; for(int i=2;i<=m;i++) { while(p&&s2[i]!=s2[p+1])p=fail[p]; if(s2[i]==s2[p+1]) p++; while(p>i/2) p=fail[p]; num[i]=sum[p]; }}LL ans=1,k=1e9+7;int main(){ int n;scanf("%d",&n); while(n--) { ans=1; scanf("%s",s2+1); int L=strlen(s2+1); init(L);get(L); for(int i=1;i<=L;i++) { ans*=(num[i]+1); ans%=k; } printf("%lld\n",ans); }}
6 0
- bzoj 3670 动物园 KMP
- 【 bzoj 3670 】 [Noi2014]动物园 - KMP
- bzoj 3670: [Noi2014]动物园 KMP
- BZOJ 3670 [Noi2014] 动物园 KMP
- 【BZOJ】3670 [Noi2014]动物园 KMP
- bzoj 3670 [Noi2014]动物园【kmp】
- BZOJ 3670: [Noi2014]动物园 KMP
- BZOJ 3670 动物园 (KMP)
- BZOJ 3670 NOI2014 动物园 KMP算法
- BZOJ 3670 NOI 2014 动物园 变形KMP
- BZOJ-3670 动物园 KMP+奇怪的东西
- [bzoj 3670] NOI 2014 动物园 变形KMP
- [KMP next树] BZOJ 3670 [Noi2014]动物园
- bzoj 3670: [Noi2014]动物园 KMP算法
- 【bzoj 3670】 [Noi2014]动物园 KMP变式
- BZOJ 3670([Noi2014]动物园-kmp变形)
- BZOJ 3670: [Noi2014]动物园(kmp+递推)
- BZOJ 3670: [Noi2014]动物园 KMP题解
- 外部存储
- (应用程序无法正常启动0xc0000142) 关于win10周年版更新后无法正常使用vc6.0问题的解决方法
- [Extjs6] 随记--如何修改font awesome图标的样式
- 4.java学习 Eclipse快捷键的使用
- LNMP centos6.7+nginx1.9.12+mysql5.7.11+php5.6.13+PHP各项扩展安装 以及openresty nginx+lua环境
- bzoj 3670 动物园 KMP
- NOi题库 8468 单词序列
- 获取Android key hash
- 坚持#第66天~十万个为什么and滑轮滑动滚动
- Javascript实现将元素插入到指定位置
- are both configured to produce the output file
- 内部排序算法
- this指针说明举例及总结
- NOIP模拟题 2016.10.13 [贪心] [记忆化搜索]