POJ-1961 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<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
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-1961 Period)