begin lydsy 2731
2016-03-18 16:17
225 查看
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
#include<iostream> #include<cstring> #include<cstdio> #define maxn 31000 char s[maxn]; int net[maxn]; int fix,ans,n,l,r,j; using namespace std; int main() { scanf("%d",&n); scanf("%s",s+1); for (int k=n/2; k>=1; k--) { int i=1,j; while (i+k<=n) { j=i+k; l=0;r=0; while (j+r<=n && s[i+r]==s[j+r]) r++; while (i-l>=1 && s[i-l]==s[j-l]) l++; if (r+l-1>=k) { printf("%d\n",k); return 0; } i=j; } } }
View Code
相关文章推荐
- 和为S的两个数
- PHP之简单MVC
- UVA10115
- Android WebView开发问题及优化汇总
- MapReduce:详解Shuffle过程
- jenkins 自动构建
- Java NIO系列教程(四) Scatter/Gather
- Java NIO系列教程(五) 通道之间的数据传输
- Java NIO系列教程(六) Selector
- ubuntu软件更新修复
- spring帝国-开篇
- Java多线程系列--“基础篇”05之 线程等待与唤醒
- JavaScript闭包产生的问题
- Hexo添加RSS
- volatile变量
- 18.位操作符操作寄存器
- Activiti eclipse开发环境搭建
- AndroidStudio中点击Project structure无反应的解决方法
- Cocos2dX通过Java服务器向Unity传输数据二
- ionic 图片拍照;选择上传 ngcordova cordovaFileTransfer cordovaCamera