D : DS串应用—最长重复子串

简介: 这篇文章提供了一种C++程序,用于通过KMP算法计算给定字符串的最长不重叠重复子串的长度,如果没有重复子串则输出-1。

D : DS串应用—最长重复子串

Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 38     Solved: 16

Description

求串的最长重复子串长度(子串不重叠)。例如:abcaefabcabc的最长重复子串是串abca,长度为4。

Input

测试次数t

t个测试串

Output

对每个测试串,输出最长重复子串长度,若没有重复子串,输出-1.

Sample Input

3
abcaefabcabc
szu0123szu
szuabcefg

Sample Output

4
3
-1

注:这里有个地方得注意,就是他最大重复子串是不重叠的。方法利用就是KMP中的一个计算next[]数组的函数的计算前后缀重复度的特性。
分两种情况判定:不重叠:k*2<=i和重叠:i/(i-k)>=2,第一个很容易理解,第二个,i/(i-k)可以求重复次数是多少
如果超过2,比如是5那么就取两个重复串,所以就有了这个式子:(i-k)单串长度 乘重复次数/2这样取的子串长度就肯定不重叠
ac代码如下:

#include<iostream>
using namespace std;
int Get_next(string a)
{
    int i=0,k=-1;
    int len=a.length(),maxn=0;
    int *nextt=new int[a.length()+1];
    nextt[0]=-1;
    while(i<len)
    {
        if(k==-1||a[i]==a[k])
        {
            i++,k++;
            nextt[i]=k;
            if(k*2<=i)maxn=max(maxn,k);
            if(i/(i-k)>=2)maxn=max(maxn,(i-k)*(i/(i-k)/2));
        }
        else k=nextt[k];
    }
    return maxn;
}
int get_maxnum(string a)
{
    int len=a.length(),maxn=0;
    for(int i=0;i<len;i++)
    {
        maxn=max(maxn,Get_next(a.substr(i,len)));
    }
    return maxn;
}
int main()
{
    string a;
    int n;
    cin>>n;
    while(n--)
    {
    cin>>a;
    int num=get_maxnum(a);
    if(!num)cout<<-1<<endl;
    else cout<<num<<endl;
    }
    return 0;
}
相关文章
|
关系型数据库 PostgreSQL
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
2183 0
|
5月前
|
算法 C++
B : DS串应用–串替换
这篇文章介绍了如何使用KMP算法在给定的主串中查找模式串的位置,并用替换串替换模式串的C++程序实现,仅考虑单次替换情况。
|
5月前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
将hex printf输出存储到变量
将hex printf输出存储到变量
|
数据库管理
CF1547B Alphabetical Strings(了解字符串的的一些规律)
CF1547B Alphabetical Strings(了解字符串的的一些规律)
85 0
|
存储 缓存 Java
【DS】哈希表的介绍和实现
【DS】哈希表的介绍和实现
80 0
【DS】哈希表的介绍和实现
.NET中将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),并使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA
.NET中将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),并使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA
362 0
|
C# 数据安全/隐私保护 数据库
C#中将字符串转换成Md5值的方法
原文:C#中将字符串转换成Md5值的方法 版权声明:有问题可联系博主QQ:15577969,大家一起相互交流和学习。 https://blog.csdn.net/qq15577969/article/details/79518724 ...
2515 0