问题描述
给定两个字符串a和b,我们将a * b定义为它们的串联。例如,如果a =“ abc”和b =“ def”,则a * b =“ abcdef”。如果我们将串联视为乘法,则以非负整数进行乘幂运算的方式为:a ^ 0 =“”(空字符串)和a ^(n + 1)= a *(a ^ n)。
输入项
每个测试用例都是代表s(可打印字符的字符串)的一行输入。s的长度至少为1,并且不超过1百万个字符。最后一个测试用例之后的一行包含一个句点。
输出量
对于每个s,您应该打印最大的n,这样对于某些字符串a,s = a ^ n。
样本输入
abcd
aaaa
bababa
.
样本输出
1
4
3
提示:
这个问题投入巨大,请使用scanf而不是cin来避免超过时间限制。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int next[1000010];
char s[1000010];
int len;
void get_next()
{
int k=-1,j=0;
next[0]=-1;
while(j<len)
{
if(k==-1||s[j]==s[k])
{
j++;
k++;
next[j]=k;
}
else
{
k=next[k];
}
}
}
int main()
{
while(scanf("%s",s)!=EOF)
{
if(strcmp(s,".")==0)
break;
int sum=0;
len=strlen(s);
get_next();
int z=len-next[len];
if(len%z==0)
{
for(int i=1; i<=len; i++)
{
if(i%z==0)
sum++;
}
printf("%d\n",sum);
}
else
{
printf("1\n");
}
}
return 0;
}