题目描述:
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).
输入:
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.
输出:
For each s you should print the largest n such that s = a^n for some string a.
样例输入:
abcd
aaaa
ababab
.
样例输出:
1
4
3
提示:
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
code:
题目大意: 给出一个字符串 问它最多由多少相同的字串组成
KMP:
用next数组求出整个数组的最大前缀,如果整个串是用循环节组成的,那么 n - next[n] 也就是最小循环节,验证最小循环节会被n整出。
#include<stdio.h>
#include<string.h>
const int maxn=1e6+10;
char a[maxn];
int nextt[maxn];
int n;
void init()
{
int i=0,j=-1;
n=strlen(a);
nextt[0]=-1;
int maxx=1;
while(i<n)
{
if(j==-1||a[i]==a[j])
{
i++;
j++;
nextt[i]=j;
}
else j=nextt[j];
}
}
int main()
{
while(1)
{
scanf("%s",a);
if(a[0]=='.')break;
init();
int n=strlen(a);
if(n%(n-nextt[n])==0)printf("%d\n",n/(n-nextt[n]));
else printf("1\n");
}
return 0;
}