您的位置:首页 > 其它

begin lydsy 2731

2016-08-15 09:56 197 查看

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\n",k);
25 return 0;
26 }
27 i=j;
28 }
29 }
30
31 }


View Code
 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: