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;
}
相关文章
|
1月前
|
算法
串ababaaababaa的next和串ababaabab的nextval
本文介绍了计算字符串的next数组和nextval数组的方法,通过分析两个具体的例子来展示如何计算这些数组,这些数组通常用于KMP算法中。
84 0
串ababaaababaa的next和串ababaabab的nextval
|
3月前
|
算法 C++
B : DS串应用–串替换
这篇文章介绍了如何使用KMP算法在给定的主串中查找模式串的位置,并用替换串替换模式串的C++程序实现,仅考虑单次替换情况。
|
3月前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
关系型数据库 PostgreSQL
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
2007 0
|
Oracle 关系型数据库 数据处理
通过Oracle识别字符串中的中文or字母or数字来介绍全角半角转换函数(to_multi_byte/to_single_byte)在varchar/clob中的使用案例
在日常处理数据的过程中,大家肯定会遇到很多奇奇怪怪的字符,然后还要对这些字符处理,比如***你有个需求:识别字符串中的中文或是识别字母或是识别数字,甚至都识别出来然后剔除or保留某些字符汉字或数字***。 你去百度了一下相关问题,然后得到的结果大都是用正则 &#39;\4E00&#39; and &#39;\9FA5&#39;来识别中文范围用a-zA-z或0-9或[:digit:][:alpha:]来识别字母或数字。但是如果你的字符串中包含全角字符,那这样是识别不全的!!!那怎么做才能够正确的识别中文、字母、数字呢???那就要考虑先做全半
通过Oracle识别字符串中的中文or字母or数字来介绍全角半角转换函数(to_multi_byte/to_single_byte)在varchar/clob中的使用案例
|
存储 Oracle 关系型数据库
Oracle Ascii& Asciistr()函数使用介绍以及常用字符ASCII码对应表
Asciistr ASCII chr(9) tab空格 chr(10) 换行 chr(13) 回车 Chr(13)&amp;amp;chr(10) 回车换行 chr(32) 空格符 chr(34) 双引号 chr(39) 单引号 chr(33) ! chr(34) &quot; chr(35) # chr(36) $ ...
Oracle Ascii& Asciistr()函数使用介绍以及常用字符ASCII码对应表
|
存储 关系型数据库 MySQL
【mysql】二进制字符串类型
【mysql】二进制字符串类型
1389 0
【mysql】二进制字符串类型
|
存储 Python
Python bytes字节串与string字符串之间的转换
Python bytes字节串与string字符串之间的转换