poj 2406 Power Strings
Posted Omz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 2406 Power Strings相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章