zoukankan      html  css  js  c++  java
  • begin lydsy 2731

    2731: 最长重复子串

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 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
    ",k);
    25                 return 0;
    26             }
    27             i=j;
    28         }
    29     }
    30      
    31 }
    View Code
     
  • 相关阅读:
    CALayer3-层的属性
    CALayer2-创建新的层
    CALayer1-简介
    autofac 使用
    .net5的异步
    动态添加菜单
    PDF解析帮助类
    正则获取字符串中两个字符串间的内容
    水晶报表
    通用easyui查询页面组件
  • 原文地址:https://www.cnblogs.com/HQHQ/p/5292563.html
Copyright © 2011-2022 走看看