1. 程式人生 > >Period(POJ 1961)

Period(POJ 1961)

ring -s 通過 循環 col 字符串 space poj 輸出

測評傳送門

題意:

一個字符串,求所有循環節長度及位置

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

通過樣例1再解釋下題意:

aa可由第1個a循環 2 次得到,輸出位置:2,循環長度:2

aaa可由第1個a循環 3 次得到,輸出位置:3,長度:3

做法:KMP的 next 預處理

code

#include<stdio.h> 
#include<string.h> 
using namespace std;
const int mxn=1e6+10; int n,cnt,next[mxn]; char str[mxn]; void Sol() { int j=0; for(int i=2;i<=n;++i) { while(j>0 && str[i]!=str[j+1]) j=next[j]; if(str[i]==str[j+1]) ++j; next[i]=j; } } int main() { while(scanf("%d",&n) && n) { scanf(
"%s",str+1); Sol(); printf("Test case #%d\n",++cnt); for(int i=2;i<=n;++i) { int len=i-next[i]; if(i!=len && i%len==0) { printf("%d %d\n",i,i/len); } } puts(""); } return 0; } /* 12 aabaabaabaab 3 aaa 0
*/

Period(POJ 1961)