uva 1328 Period(KMP循环节)
来源:互联网 发布:石家庄seo周少鹏新浪 编辑:程序博客网 时间:2024/06/13 00:00
题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4074
思路:
1.对于某个字符串S,长度为len,由长度为L的字符串s重复R次得到,当R≥2时必然有S[0..len-L-1]=S[L..len-1],那么对于KMP算法来说,就有next[len]=len-L。即循环长度为len-next[len]。所以若i%(i-next[i])==0则改字符串可由长为i-len[i]的字符串s重复i/(i-next[i])得到。
2.对于样例2,长为12时,next[12]=9。即s[0...8]==s[3....11],s[0]s[1]s[2]==s[3]s[4]s[5],s[3]s[4]s[5]==s[6]s[7]s[8],s[6]s[7]s[8]==s[9]s[10]s[11],即循环长度为3。
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=1000000+50;int f[maxn];char st[maxn];void getFail(char* p,int* f){ int m=strlen(p); f[0]=0,f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j&&p[i]!=p[j]) j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; }}int main(){ int cas=0,n; while(scanf("%d",&n)!=EOF&&n) { getchar(); scanf("%s",st); getFail(st,f); printf("Test case #%d\n",++cas); for(int i=2;i<=n;i++) { if(f[i]>0&&(i%(i-f[i])==0)) { printf("%d %d\n",i,i/(i-f[i])); } } printf("\n"); } return 0;}
阅读全文
0 0
- uva 1328 Period(KMP循环节)
- UVA 1328 Period(KMP:最短循环节)
- uva 1328 Period(KMP)
- UVA 1328 - Period (KMP)
- UVA 1328 Period(KMP)
- hdu 1358 Period(KMP 循环节)
- POJ 1961 Period(kmp循环节)
- Period (HDU_1358) KMP+循环节
- Period--KMP,最小循环节
- uva uva 1328 - Period ---KMP算法
- uva 1328 - Period (周期串的判断 kmp)
- poj 1961 Period (KMP 最短循环节)
- poj1961--Period(KMP求最小循环节)
- E - Period poj1611(kmp 计算前缀循环节)
- POJ 1961 Period(KMP最小循环节)
- 【POJ 1961】Period(KMP求循环节)
- poj1961——Period(KMP循环节)
- HDU 1358 Period (kmp求循环节)
- 创建一个二叉树时关于scanf函数使用
- 山东省高校组队训练邀请赛——AC题目(4AC:3水题,1扩展欧几里得)
- 水题笔记:noip2013 货车运输 [LCA]
- 三、servlet的简单创建
- 310. Minimum Height Trees
- uva 1328 Period(KMP循环节)
- 今日头条实习面试总结(2)
- 加入ospf area0 抓包图
- 用servlet在网页生成验证码并验证
- C++重载、重写、重定义区别
- Spring 发送ajax中文乱码
- Sails+MVC+Mysql+Node+学习笔记一
- C++primer[习题][第二章][21-30]
- hdu 5969 最大的位或(贪心)