poj1961解題報告

Period
Time Limit: 3000MS   Memory Limit: 30000K
Total Submissions: 13616   Accepted: 6417

Description

For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know the largest K > 1 (if there is one) such that the prefix of S with length i can be written as AK ,that is A concatenated K times, for some string A. Of course, we also want to know the period K.

Input

The input consists of several test cases. Each test case consists of two lines. The first one contains N (2 <= N <= 1 000 000) – the size of the string S.The second line contains the string S. The input file ends with a line, having the 
number zero on it.

Output

For each test case, output "Test case #" and the consecutive test case number on a single line; then, for each prefix with length i that has a period K > 1, output the prefix size i and the period K separated by a single space; the prefix sizes must be in increasing order. Print a blank line after each test case.

Sample Input

3
aaa
12
aabaabaabaab
0

Sample Output

Test case #1
2 2
3 3

Test case #2
2 2
6 2
9 3
12 4
源代碼:
#include<iostream>
#include<cstring>
using namespace std;
int next[1000010];
char ch[1000010];
int len;
void getnext()
{
    int i,j;
	i=0;
	j=-1;
	next[0]=-1;
	while (i!=len)
	{
	    if (j==-1 || ch[i]==ch[j])
			next[++i]=++j;
		else 
			j=next[j];
	}
}
int main()
{
    int i,length,t=1;
	while (cin>>len && len!=0)
	{
	    scanf("%s",ch);
		getnext();
		cout<<"Test case #"<<t<<endl;
		t++;
        for (i=1;i<=len;++i)
		{
		    length=i-next[i];
			if (i!=length && i%length==0)
				cout<<i<<" "<<i/length<<endl;
		}
		cout<<endl;
	}
	return 0;
}
本題題意:本題跟2406差不多,就是要再進行一次遍歷,尋找出所有能夠循環的次數,給你一個字符串,你要將裏面可以循環的區間都求出來,但是區間的開頭必須是從0開始的,遍歷一遍,找出從0開始可以循環的全部符合要求的區間,再把區間裏面循環的次數給輸出出來,同樣也是用了kmp算法的求next數組,兩道題幾乎相似,推薦大家做kmp算法類型的題目時候1961和2406一起做,這樣更容易鞏固。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章