begin lydsy 2731
来源:互联网 发布:拟线性偏好知乎 编辑:程序博客网 时间:2024/05/01 20:23
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,求它的最长重复子串。
输入长度为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 }
0 0
- begin lydsy 2731
- Zju1290 Word-Search Wonder(http://begin.lydsy.com/JudgeOnline/problem.php?id=2768)
- http://begin.lydsy.com/JudgeOnline/problem.php?id=2770(PKU2503 Babelfish)
- http://begin.lydsy.com/JudgeOnline/problem.php?id=2774(poi病毒)
- BEGIN...
- Begin!
- begin
- Begin
- Begin!
- begin
- BEGIN
- Begin
- Begin
- begin!
- begin
- Begin
- begin
- begin
- bzoj1355——2016——3——15
- bzoj3942——2016——3——15
- 2016——3——16 kmp 7题
- 编译fdk-aac for ios
- 几种哈希算法原理(转发)
- begin lydsy 2731
- Zju1290 Word-Search Wonder(http://begin.lydsy.com/JudgeOnline/problem.php?id=2768)
- 这些时间投,更容易被HR“翻牌子”!
- 关键词匹配(Ac自动机模板题)
- BufferKnife及插件使用
- 利用 ajax 像后台传递数组
- Android 优秀文章收集整理集合
- 5个最佳的Android测试框架(带示例)
- http://begin.lydsy.com/JudgeOnline/problem.php?id=2770(PKU2503 Babelfish)