POJ-1961(Period)(kmp())
Description
Input
number zero on it.
Output
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
題意:在前i個字符中,循環節出現的次數(要求循環節出現的次數要大於1),比如aabaabaabaab,在前兩個字符中a出現了兩次,循環節爲a。在前6個字符中,循環節出現了2次,循環節爲aab,在前9個字符中,循環節出現了3次,循環節爲aab;在12個字符中循環節出現了4次,循環節爲aab。
My solution:
/*2016.4.11*/
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char c[1000100];
int nest[1000100],n;
void getnest()
{
int i,j,k=0,t;
i=0;j=-1;
nest[i]=j;
while(i<n)
{
if(j==-1||c[i]==c[j])
{
i++;
j++;
t=i-j;//求循環節長度
if(j&&i%t==0)//注意j不能等於0,否則循環節出現的次數爲1,即:循環節爲前i個字符.(不符題意)
{
// k=1;
printf("%d %d\n",i,i/t);
}
nest[i]=j;
}
else
j=nest[j];
}
// if(k==0)
// printf("0 0\n");//題中所給的測試數據都能找到循環節,因此不用考慮不存在的情況
}
int main()
{
int i=0,j,k,m;
while(scanf("%d",&n)==1&&n)
{
i++;
if(i!=1)//注意格式
printf("\n");
scanf("%s",c);
printf("Test case #%d\n",i);
getnest();
}
return 0;
}