题意:
给你一个字符串 问你最多由多少相同的子串组成这个字符串。
题解:
这道题是求KMP循环节次数的,我一看不就是个模板题吗,直接上去打了模板然后WA了,百思不得其解,后来想了一下,len%(len-next[len])==0才能输出len/(len-next[len]),否则只能为1。因为题目要求必须由相同的字符串组成完整的S,所以不能整除的话说明没有循环节了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=1000000+7;
char s[MAXN];
int Next[MAXN];
void getNext()
{
Next[0]=-1;
int j=0,k=-1;
int slen=strlen(s);
while(j<slen)
{
if(k==-1||s[k]==s[j])
{
j++;
k++;
Next[j]=k;
}
else
k=Next[k];
}
}
int main()
{
while(~scanf("%s",s))
{
if(s[0]=='.')
break;
getNext();
int slen=strlen(s);
int L=slen-Next[slen];
if(slen%L==0)
printf("%d\n",slen/L);
else
printf("1\n");
}
}