(KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)
题目:
Period
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3813 Accepted Submission(s): 1862
3 aaa 12 aabaabaabaab 0
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
题目分析:
KMP。简单题。这一道题其实和KMP 1.4那道题的思想是一样的。
代码如下:
/* * hdu1358.cpp * * Created on: 2015年4月18日 * Author: Administrator */ #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int maxn = 1000001; int m;//目标串的长度 char pattern[maxn];//模式串 int nnext[maxn];//next数组.直接起next可能会跟系统中预定的重名. /*O(m)的时间求next数组*/ void get_next() { m = strlen(pattern); nnext[0] = nnext[1] = 0; for (int i = 1; i < m; i++) { int j = nnext[i]; while (j && pattern[i] != pattern[j]) j = nnext[j]; nnext[i + 1] = pattern[i] == pattern[j] ? j + 1 : 0; } } int main(){ int cnt = 1; while(scanf("%d",&m)!=EOF,m){ scanf("%s",pattern); get_next(); printf("Test case #%d\n",cnt++); /** * 遍历next数组。 * 输出循环节数>=2的情况 */ int i; for(i = 0 ; i <= m ; ++i){ if(nnext[i] == 0){ continue; } int len = i - nnext[i]; if(i%len == 0){ printf("%d %d\n",i,i/len); } } printf("\n"); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。