Given two strings a and b we define a∗b to be their concatenation. For example, if a = ‘abc’ and b = ‘def’ then a∗b = ‘abcdef’. If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a0 = ‘’ (the empty string) and a(n+1) = a∗(an).
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 s = an for some string a.
Sample Input
abcd
aaaa
ababab
.
Sample Output
1
4
3
翻译:
POJ 2406:Power Strings
题意:给一个字符串S长度不超过10^6,求最大的n使得S由n个相同的字符串a连接而成,如:"ababab"则由n=3个"ab"连接而成,"aaaa"由n=4个"a"连接而成,"abcd"则由n=1个"abcd"连接而成。
传统朴素算法时间复杂度:O(m*n)
KMP算法时间复杂度:O(m+n)
code:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=1000005;
char p[N];
int nextl[N];
void getnext()
{
int j=0;
int k=-1;
nextl[0]=-1;
while(j<strlen(p))
{
if(k==-1||p[j]==p[k])
{
nextl[++j]=++k;
}
else
k=nextl[k];
}
return ;
}
int main()
{
freopen("51.in","r",stdin);
freopen("51.out","w",stdout);
memset(nextl,0,sizeof(nextl));
int n;
while(1)
{
memset(nextl,0,sizeof(nextl));
scanf("%s",p);
n=strlen(p);
if(p[0]=='.')
{
break;
}
getnext();
if(n%((n-1)-nextl[n-1])==0)
printf("%d\n",n/((n)-nextl[n]));
else
printf("1\n");
}
return 0;
}