连续重复子串
Problem:1269
Time Limit:1000ms
Memory Limit:65535K
Description
如果一个字符串S是由字符串t重复K次得到的,则称S是一个连续重复串,K是这个字符串的重复次数。现在有一个字符串S,请你求出最大的K值?
Input
输入包含多组数据。每组数据输入一个字符串S(1<=|S|<=1e5),S由英文小写字母构成。
Output
输出字符串S对应的最大的K值。
Sample Input
absaabsaabsa abababab abba
Sample Output
3 4 1
Hint
Source
CJJ
题意:中文题。
思路:求出Next数组,Next数组下标表示的是最长前缀-后缀的长度,用len-next[len-1]得到的就是字符串t的长度。所以用len/(len-ne[len-1])就是字符串t出现的次数。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100005;
char str[maxn];
int ne[maxn];
void make_next(char p[],int ne[],int len)
{
ne[0]=0;
for(int i=1,k=0;i<len;i++)
{
while(p[i]!=p[k]&&k>0) k=ne[k-1];
if(p[i]==p[k]) k++;
ne[i]=k;
}
}
int main()
{
while(~scanf("%s",str))
{
memset(ne,0,sizeof(ne));
int len=strlen(str);
make_next(str,ne,len);
printf("%d\n",len/(len-ne[len-1]));
}
return 0;
}