Period(POJ 1961)
阿新 • • 發佈:2018-11-08
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)