你需要前置KMP知识。
题目大意
给定若干个的字符串,问每个字符串最多是由多少个相同的子字符串重复连接而成的。
字符串长度<=10^6。
题目分析
对与next数组的小应用。
字符串长度-最后一个字符的next=子字符串的长度
ball ball 你们感性理解一下!!!挺好懂但是挺难说的。
这个解释的挺棒的:https://hzz.blog.luogu.org/solution-uva10298
然后判断是否能整除。
最后,next是Linux关键字,所以改个名哈。
下面为了方便理解就没有改,直接copy会CE哦。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[1000010];
int next[1000010];
int main()
{
while(1)
{
scanf("%s",a+1);
int ls=strlen(a+1);
if(ls==1&&a[1]=='.') return 0;
int k=0; next[0]=next[1]=0;
for(int i=2;i<=ls;i++)
{
while(k>0&&a[k+1]!=a[i]) k=next[k];
if(a[k+1]==a[i]) k++;
next[i]=k;
}
int d=ls-next[ls];//d表示子字符串的长度
if(ls%d==0) printf("%d\n",ls/d);
else printf("1\n");
}
return 0;
}