begin lydsy 2731

    xiaoxiao2025-07-17  8

    2731: 最长重复子串

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 4[Submit][Status][Web Board]

    Description

    如果一个串x在S中出现,并且xx也在S中出现,那么x就叫做S的重复子串。  输入长度为n的串S,求它的最长重复子串。 

    Input

    首先给出字符串长度,其小于等于30000,接下来一个字符串

    Output

    如题 

    Sample Input

    12 ABBABBCBCCCC

    Sample Output

    3

    HINT

     

    Source

     题解:就是最长连续重复子串XX,先假设有两个点相距k(k为题目答案)分别为i,j且i,j分别为第一个X和第二个X中的一个点,

        那么就会有一个R和L,R+L=k-1  && for z=1 to r do s[i+z]==s[j+z] && for z=1 to l do s[i-z]==s[j-z](这个自己画画图就可以知道了);

        所以枚举k就可以了  详细分析可以看:http://wenku.baidu.com/link?url=RNgJuj25v47IZ37Nc6iqEsqwhARFmXEe2gKRQuOys574byP2ozEJaKq-qMvYlo482P1CoKnLlxz0lLHetYnent78SXzWEGYbF5uNZ14A2pW

    1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #define maxn 31000 5 char s[maxn]; 6 int net[maxn]; 7 int fix,ans,n,l,r,j; 8 using namespace std; 9 int main() 10 { 11 scanf("%d",&n); 12 scanf("%s",s+1); 13 for (int k=n/2; k>=1; k--) 14 { 15 int i=1,j; 16 while (i+k<=n) 17 { 18 j=i+k; 19 l=0;r=0; 20 while (j+r<=n && s[i+r]==s[j+r]) r++; 21 while (i-l>=1 && s[i-l]==s[j-l]) l++; 22 if (r+l-1>=k) 23 { 24 printf("%d\n",k); 25 return 0; 26 } 27 i=j; 28 } 29 } 30 31 } View Code

     

     

     
    转载请注明原文地址: https://ju.6miu.com/read-1300795.html
    最新回复(0)