begin lydsy 2731
2016-08-15 09:56
197 查看
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
相关文章推荐
- 几种哈希算法原理(转发)
- 编译fdk-aac for ios
- 2016——3——16 kmp 7题
- 【疑难杂症】webview与scrollview嵌套碰到的难题!webview高度在横屏后更改!
- bzoj3942——2016——3——15
- bzoj1355——2016——3——15
- poj 3641 ——2016——3——15
- KMP之我见
- Bitmap——内存缓存LruCache实现原理
- 转自他人——————TLE之前,没有一个节点叫失败!!!
- 编译x264 for ios
- bzoj1449————2016——3——14
- bzoj1070————2016——3——14
- 实时RGBD_ORB_SLAM (Ubuntu+Xtion)
- vi的保存退出指令
- bzoj3571————2016——3——12(最小乘积匹配)
- bzoj1562[NOI2009]变换序列——2016——3——12
- QT 资料大全
- Oracle的存储过程
- 新人报到,第一天