D: 字符串最大表示
时间限制: 1 s 内存限制: 128 MB
题目描述
有如下定义,abcnabcn表示字符串abc重复n次,例如abc2abc2表示abcabc。
给定一个字符串,求可以被表示的最大n,例如:aaaa最大个数是4,重复子串为a;abababab最大个数是4,重复子串是ab;ababababc最大个数是1, 重复子串是ababababc。
输入
第一行输入n,表示字符串的个数。(n <= 100)
接下来n行,每行一个字符串。(字符串长度<=100000)
输出
输出可以表示给定字符串的最大子串个数
样例输入
3
aaaa
abababab
abc
样例输出
4
4
1
提示
输入数据量大,推荐使用scanf
来源
题意:求出循环段重复次数
分析:求出next数组,最后一个next值就是整个字符串的最长公共前后缀,长度减去该值就是循环段的长度长度除以循环段就是循环段个数;
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
char s[100011];
int nex[100011];
void get_next()
{
int i=0,j=-1,len=strlen(s);
nex[0]=-1;
while(i<len)
{
if(j==-1||s[i]==s[j])
nex[++i]=++j;
else
j=nex[j];
}
}
int main()
{
int n,len;
scanf("%d",&n);
while(n--)
{
memset(nex,0,sizeof(nex));
scanf("%s",s);
get_next();
len=strlen(s);
printf("%d
",len/(len-nex[len]));
}
}