212 字
1 分钟
POJ 2406 Power Strings 题解 KMP 适配函数
Description
Given two strings a and b we define ab to be their concatenation. For example, if a = “abc” and b = “def” then ab = “abcdef” . If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n) .
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that for some string a.
Sample Input
abcdaaaaababab.
Sample Output
143
题解
主要考虑 KMP 中失陪函数的意义
因为整个串是会重复的
所以整个串的长度一定是串长减最后一个字符的fail的倍数
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=1000005;char S[N];int next[N],len;void get_next(){ next[0]=-1;next[1]=0; for(int i=2,j=0;i<=len;i++){ while(~j&&S[j+1]!=S[i])j=next[j]; next[i]=++j; }}int main(){ while(1){ memset(S,0,sizeof(S)); scanf("%s",S); len=strlen(S)-1; if(S[0]=='.')break; get_next(); //for(int i=1;i<=len;i++)printf("%d ",next[i]); //puts(""); if((len+1)%(len-next[len])==0)printf("%d\n",(len+1)/(len-next[len])); else puts("1"); }}
POJ 2406 Power Strings 题解 KMP 适配函数
https://www.nekomio.com/posts/2/