HDU 1358 KMP运用 求某串中所有循环前缀串的长度和循环次数
2013-01-25 19:39
316 查看
解题思路:
这个题其实用的是next[]数组的性质来求周期、假设前K个元素匹配成功,则有str[1]=str[i-next[i] ],str[2]=str[i-next[i]+1]······str[i]=str[next[i]]。那么我们知道从str[0]到str[next[i]]是字符串的一个循环周期,即i-next[i]为重复的长度,那么长度为K的字符串中的循环次数为i/(i-next[i])。想通这点,这个题就没什么难度了·····
这个题其实用的是next[]数组的性质来求周期、假设前K个元素匹配成功,则有str[1]=str[i-next[i] ],str[2]=str[i-next[i]+1]······str[i]=str[next[i]]。那么我们知道从str[0]到str[next[i]]是字符串的一个循环周期,即i-next[i]为重复的长度,那么长度为K的字符串中的循环次数为i/(i-next[i])。想通这点,这个题就没什么难度了·····
#include<stdio.h> #include<string.h> char str[1000100]; int n,len,next[10001000]; void get_next() { int i=1,j=0; next[0]=-1; while(i<n) { if(j==-1||str[i]==str[j]) { i++;j++;next[i]=j; } else j=next[j]; } } int main() { int i,count=1; while(~scanf("%d",&n),n) { scanf("%s",str); get_next(); printf("Test case #%d\n",count++); for(i=1;i<=n;i++) { int temp=i-next[i]; if(i%temp==0&&i/temp>1) { printf("%d %d",i,i/temp); printf("\n"); } } printf("\n"); } return 0; }
相关文章推荐
- HDU 1358 Period(KMP求前缀子串的循环次数)
- hdu 1358 Period (KMP求循环次数)
- HDU 1358 Period 【KMP】(子串循环次数)
- Hdu 4552 怪盗基德的挑战书 (所有前缀出现次数和 后缀数组或KMP)
- HDU 3336 Count the string (KMP next数组运用——统计前缀出现次数)
- HDU 3336 KMP 求所有前缀在母串中出现的次数
- hdu_1358Period(kmp找循环前缀)
- hdu 1358 kmp 求前缀有几个循环
- POJ 2752 (KMP 所有可能长度的前缀后缀) Seek the Name, Seek the Fame
- hdu 1358 Period【KMP字符串循环】
- poj_2752_kmp_nxt_application_求s 所有子串是s的前缀又是后缀的长度
- hdu 1358 KMP的next数据运用
- hdoj 4552 怪盗基德的挑战书 【KMP 求所有前缀在原串种出现的次数之和】
- 循环节的长度,循环节,循环次数(kmp)
- HDU - 1358 Period KMP循环节出现次数
- nyoj 329 循环小数【KMP】【求最小循环节长度+循环次数+循环体】
- HDU 3336 Count the string 所有前缀在串中的出现总次数
- Hdu 5782 Cycle(给你两个长度相同的字符串,对于长度为i的前缀,如果这两个字符串的前缀是循环相等的,那么输出1,否则输出0)
- Hdu 3336 Count the string (KMP+DP 前缀出现次数和)
- hdu 1358 Period(KMP循环)