Just Oj 2017C语言程序设计竞赛高级组D: 字符串最大表示(next数组)

 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

来源

jxust__ACM

题意:求出循环段重复次数
分析:求出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]));
        }
}
原文地址:https://www.cnblogs.com/aeipyuan/p/10079524.html