首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

hdu1358 Period KMP之next函数魂 KMP的周期 周期 周期

2012-09-17 
hdu1358 PeriodKMP之next函数灵魂KMP的周期 周期 周期PeriodTime Limit: 2000/1000 MS (Java/Others)Memor

hdu1358 Period KMP之next函数灵魂 KMP的周期 周期 周期

Period

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 964    Accepted Submission(s): 480


Problem DescriptionInputOutputSample InputSample Output#include<stdio.h>#include<string.h>int next[1000002],d;char a[1000002];void get_next(){int i=1,j=0;next[1]=0;while(i<=d){if(j==0||a[i]==a[j]) {i++;j++;next[i]=j;}else j=next[j];}}int main(){int i,k,t=0,flag;while(1){flag=1;memset(next,0,sizeof(next));scanf("%d",&d);if(d==0) return 0;scanf("%s",a+1);get_next();printf("Test case #%d\n",++t);// for(i=1;i<=d+1;i++) printf("%d ",next[i]);// printf("\n");for(i=2;i<=d;i++){k=i-(next[i+1]-1);/*next[i+1]-1是i+1之前的循环长度 用i一减就是剩下的长度 如果剩下的长度为一个重复串的长度则可以输出 否则不能输出 如 abcabcabc next[10]-1=6 用i一减(等于从abcabcabc中把abcabcabc拿走) 剩下个3(即abc) i是3的整数倍(长串的1到i的子串中是全由abc组成) 此时能输出next[9]-1=2 说明剩下的不够一个重复串 即不能被i整除 不能输出*/if(i!=k&&i%k==0) printf("%d %d\n",i,i/k);//i==k是指循环长度为0 即没有循环}printf("\n");}return 0;}/*非优化的next数组的含义是:next[i]=k模式串下标为i的字符的前k-1个字符与开首的前k-1个字符相等例如 aabaabaab next[10]=7 表示下标为10之前的字符前6个字符 与开首的前6个字符相等 所以当匹配不成功时 不用回溯到下标为6的位置去继续匹配*/

热点排行