1. 程式人生 > >poj 2406 Power Strings

poj 2406 Power Strings

函數 pre mp算法 sin 題意 print urn 個數 names

https://vjudge.net/problem/POJ-2406

題意:

求一個字符串的最小循環節的循環次數。

思路:

參考了白書的213頁的例題,如何求循環節的長度,用kmp算法所得到的失配函數進行求解。循環節的長度是i - f[i]。因此這題直接用len / (len-f[len]) 求解循環節的個數,wa了一次,是因為len % (len-f[len]) 必須得等於0才行,循環節的長度肯定是能夠整除長度才行,比如ababa這個例子。

代碼:

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <string
> 4 #include <string.h> 5 using namespace std; 6 7 string text; 8 char a[1000005]; 9 int fl[1000005]; 10 11 void getfail(string p,int* f) 12 { 13 int m = p.size(); 14 15 f[0] = f[1] = 0; 16 17 for (int i = 1;i < m;i++) 18 { 19 int j = f[i]; 20 21 while (j && p[i] != p[j]) j = f[j];
22 23 f[i+1] = p[i] == p[j] ? j+1 : 0; 24 } 25 } 26 27 int main() 28 { 29 while (scanf("%s",a) != EOF) 30 { 31 memset(fl,0,sizeof(fl)); 32 33 if (a[0] == .) break; 34 35 text = string(a); 36 37 getfail(a,fl); 38 39 int len = text.size();
40 41 if (len % (len - fl[len]) == 0) 42 { 43 int ans = len / (len - fl[len]); 44 45 printf("%d\n",ans); 46 } 47 else 48 printf("1\n"); 49 50 51 } 52 53 return 0; 54 }

poj 2406 Power Strings