Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2398 Accepted Submission(s): 1187
php
i 0 1 2 3 4 5 6 7 8 9 10 11 a[i] a a b a a b a a b a a b next[i] -1 0 1 0 1 2 3 4 5 6 7 8
↓ios
next[i]值是0或-1的忽略。算法
注意:因爲輸出次數太多 (2 <= N <= 1 000 000),建議用printf輸出,不然會超時。數組
代碼:spa
1 #include <iostream>
2 #include <stdio.h>
3 using namespace std; 4 char a[1000010]; 5 int next[1000010]; 6 int n; 7 void GetNext() //得到a數列的next數組
8 { 9 int i=0,k=-1; 10 next[0] = -1; 11 while(i<n){ 12 if(k==-1){ 13 next[i+1] = 0; 14 i++;k++; 15 } 16 else if(a[i]==a[k]){ 17 next[i+1] = k+1; 18 i++;k++; 19 } 20 else
21 k = next[k]; 22 } 23 } 24 void DisRes(int num) 25 { 26 int j; 27 printf("Test case #%d\n",num); 28 for(int i=0;i<=n;i++){ 29 if(next[i]==-1 || next[i]==0) //next[i]是-1或0的忽略,說明以前沒有周期性前綴
30 continue; 31 j = i - next[i]; 32 if(i%j==0) //能整除,說明存在週期性前綴
33 printf("%d %d\n",i,i/j); //輸出這個前綴的長度和週期數
34 } 35 printf("\n"); 36 } 37 int main() 38 { 39 int num = 0; 40 while(scanf("%d",&n)!=EOF){ 41 if(n==0) break; 42 scanf("%s",a); 43 GetNext(); //得到next[]數組
44 DisRes(++num); //輸出結果
45 } 46 return 0; 47 }
Freecode : www.cnblogs.com/yym2013code