【ybtoj】重复子串
题目描述
样例输入
abcd
aaaa
ababab
.
样例输出
1
4
3
解题思路
这道题的数据规模很大,直接暴力会超时,find函数也会超时,只能使用KMP算法
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char s[10000005];
int len, p[10000005];
int main()
{
scanf("%s",s+1);
len=strlen(s+1);
while(len!=1||s[1]!='.')
{
len=strlen(s+1);
int j=0;
for(int i=2;i<=len;++i)
{
while(j&&s[i]!=s[j+1]) j=p[j];
if(s[i]==s[j+1]) ++j;
p[i]=j;
}
if(len%(len-p[len])==0) printf("%d\n",len/(len - p[len]));
else printf("1\n");
scanf("%s",s+1);
len=strlen(s+1);
}
return 0;
}