【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;
}
博客介绍了如何在【ybtoj】平台上解决重复子串的问题。由于数据量大,暴力和find函数方法效率低下,作者采用了KMP算法来避免超时,从而提高求解效率。

被折叠的 条评论
为什么被折叠?



