poj 1961 Period(kmp)

来源:互联网 发布:贷款抢单软件 编辑:程序博客网 时间:2024/06/05 01:11

题目链接:poj1961

题目大意:

给你一个字符串,求这个字符串到第i个字符为止的循环节的次数。

比如aabaabaabaab,长度为12.到第二个a时,a出现2次,输出2.到第二个b时,aab出现了2次,输出2.到第三个b时,aab出现3次,输出3.到第四个b时,aab出现4次,输出4.


解题思路:

这道题好像就是POJ 2406的加强版而已。那道题是输出一个字符串的循环节出现的次数,这个是到第i个字符为止,其实就是多了一层循环。把这个字符串遍历一次即可。

#include <stdio.h>#include <algorithm>#include <iostream>#include <string.h>using namespace std;#define maxn 2000100char s[maxn];int nexts[maxn];int n,m;void getnexts(){int j=0;int k=-1;nexts[0]=-1;while(j<m){if(k==-1||s[j]==s[k]){j++;k++;nexts[j]=k;}else k=nexts[k];}}int main(){int cas=1;while(~scanf("%d",&m)&&m){scanf("%s",s);getnexts();printf("Test case #%d\n",cas++);for(int i=2;i<=m;i++){if(i!=(i-nexts[i])&&i%(i-nexts[i])==0)printf("%d %d\n",i,i/(i-nexts[i]));}printf("\n");}    return 0;}


原创粉丝点击