POJ-1964 Period

题目链接:http://poj.org/problem?id=1961

题目大意:

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

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


解题思路:

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


代码如下:

#include #include #include #include #include using namespace std; #define N 1000010 char s[N]; int nextval[N]; int len; void getnext(const char *s) { int i = 0, j = -1; nextval[0] = -1; while(i != len) { if(j == -1 || s[i] == s[j]) nextval[++i] = ++j; else j = nextval[j]; } } int main() { int T = 1; int length, add; while(scanf("%d", &len) && len) { scanf("%s", s); getnext(s); printf("Test case #%d\n", T++); for(int i = 1; i <= len; ++i) { length = i - nextval[i]; //循环节的长度 if(i != length && i % length == 0) //如果有多个循环 printf("%d %d\n", i, i / length); } printf("\n"); } return 0; }

你可能感兴趣的:(POJ-1964 Period)