[KMP-循环节问题]HDU 1358 period
2012-06-27 17:13
344 查看
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1358
题目大意:给定一个字符串,求出所有循环的前缀串,输出前缀串的长度和循环的次数(大于一才算循环串)
思路:同上一道题一样,也是求循环节,这里,枚举长度为2-N的所有前缀串(next数组可以一次预处理求出),求出其最小循环节,判断前缀串长度是否可以整除循环节长度整除,并且前缀串长度不等于循环节长度,满足条件就输出。
代码:
题目大意:给定一个字符串,求出所有循环的前缀串,输出前缀串的长度和循环的次数(大于一才算循环串)
思路:同上一道题一样,也是求循环节,这里,枚举长度为2-N的所有前缀串(next数组可以一次预处理求出),求出其最小循环节,判断前缀串长度是否可以整除循环节长度整除,并且前缀串长度不等于循环节长度,满足条件就输出。
代码:
#include<iostream> using namespace std; const int MAXN = 1111111; int N,next[MAXN],cas; char s[MAXN]; void makenext(){ int i = 0,j = -1; next[0] = -1; while(i<=N){ if(s[i]==s[j]||j==-1)next[++i]=++j; else j = next[j]; } } void solve(){ for(int i=2;i<=N;i++){ int L = i-next[i]; if((i%L)==0&&(i/L)!=1){ printf("%d %d\n",i,i/L); } } } int main(){ while(scanf("%d",&N),N){ scanf("%s",s); makenext(); printf("Test case #%d\n",++cas); solve(); puts(""); } return 0; }
相关文章推荐
- HDU 1358 Period(kmp循环节)
- 【KMP(循环节)】poj 2406 Power Strings(外:hdu 1358 Period)
- hdu 1358 Period(KMP循环节)
- HDU1358——Period(KMP求最小循环节)
- HDU - 1358 Period KMP循环节出现次数
- HDU 1358 Period [KMP+循环节]
- HDU-1358 Period 字符串问题 KMP算法 求最小循环节
- HDU1358 Period(KMP,找循环节)
- Hdu 1358 Period (KMP 求最小循环节)
- hdu 1358 Period(KMP 循环节)
- (KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)
- HDU 1358 Period (next跳表找最小循环节)KMP
- Period (poj 1961&&hdu 1358)KMP
- [HDU 1358]Period[kmp求周期]
- HDU 1358 Period(KMP)
- hdu 3746(KMP的循环节问题)
- HDU 1358 Period ——kmp
- hdu 1358 Period(KMP)
- HDU 1358 Period 求前缀长度和最小循环节长度
- HDU 1358 Period 求周期串(kmp)