Longest Common Substring

Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 37 Accepted Submission(s): 28
 
Problem Description
Given two strings, you have to tell the length of the Longest Common Substring of them.

For example:
str1 = banana
str2 = cianaic

So the Longest Common Substring is "ana", and the length is 3.

 
Input
The input contains several test cases. Each test case contains two strings, each string will have at most 100000 characters. All the characters are in lower-case.

Process to the end of file.

 
Output
For each test case, you have to tell the length of the Longest Common Substring of them.
 
Sample Input
  1. banana
  2. cianaic
 
Sample Output
  1. 3
 
Author
Ignatius.L
 
  1. /*----------------------------------------------
  2. File: F:\ACM源代码\数据结构--后缀数组\Longest_Common_Substring.cpp
  3. Date: 2017/5/30 16:55:36
  4. Author: LyuCheng
  5. ----------------------------------------------*/
  6. /*
  7. 题意:最长公共子序列
  8.  
  9. 思路:问题很多,DP基本不用考虑,因为时间复杂度空间复杂度都不允许,NlogN的算法也不行,最坏的情况
  10. 转化成LIS的数组是1e10空间复杂的不允许,所以只能利用后缀数组的性质,将两个连接,然后前后两个
  11. 前缀在两个不同的字符串中的时候,更新height的值,因为后缀加前缀,刚好是公共子序列
  12. */
  13. #include <bits/stdc++.h>
  14. #define MAXN 100005
  15. using namespace std;
  16. char s1[MAXN],s2[MAXN];
  17. /****************************************后缀数组模板****************************************/
  18. const int maxn=+;
  19. struct SuffixArray
  20. {
  21. char s[maxn];
  22. int sa[maxn],rank[maxn],height[maxn];
  23. int t1[maxn],t2[maxn],c[maxn],n;
  24. int dmin[maxn][];
  25. void build_sa(int m)
  26. {
  27. int i,*x=t1,*y=t2;
  28. for(i=;i<m;i++) c[i]=;
  29. for(i=;i<n;i++) c[x[i]=s[i]]++;
  30. for(i=;i<m;i++) c[i]+=c[i-];
  31. for(i=n-;i>=;i--) sa[--c[x[i]]]=i;
  32. for(int k=;k<=n;k<<=)
  33. {
  34. int p=;
  35. for(i=n-k;i<n;i++) y[p++]=i;
  36. for(i=;i<n;i++)if(sa[i]>=k) y[p++]=sa[i]-k;
  37. for(i=;i<m;i++) c[i]=;
  38. for(i=;i<n;i++) c[x[y[i]]]++;
  39. for(i=;i<m;i++) c[i]+=c[i-];
  40. for(i=n-;i>=;i--) sa[--c[x[y[i]]]] = y[i];
  41. swap(x,y);
  42. p=,x[sa[]]=;
  43. for(i=;i<n;i++)
  44. x[sa[i]]= y[sa[i]]==y[sa[i-]]&&y[sa[i]+k]==y[sa[i-]+k]? p-:p++;
  45. if(p>=n) break;
  46. m=p;
  47. }
  48. }
  49. void build_height()//n不能等于1,否则出BUG
  50. {
  51. int i,j,k=;
  52. for(i=;i<n;i++)rank[sa[i]]=i;
  53. for(i=;i<n;i++)
  54. {
  55. if(k)k--;
  56. j=sa[rank[i]-];
  57. while(s[i+k]==s[j+k])k++;
  58. height[rank[i]]=k;
  59. }
  60. }
  61. void initMin()
  62. {
  63. for(int i=;i<=n;i++) dmin[i][]=height[i];
  64. for(int j=;(<<j)<=n;j++)
  65. for(int i=;i+(<<j)-<=n;i++)
  66. dmin[i][j]=min(dmin[i][j-] , dmin[i+(<<(j-))][j-]);
  67. }
  68. int RMQ(int L,int R)//取得范围最小值
  69. {
  70. int k=;
  71. while((<<(k+))<=R-L+)k++;
  72. return min(dmin[L][k] , dmin[R-(<<k)+][k]);
  73. }
  74. int LCP(int i,int j)//求后缀i和j的LCP最长公共前缀
  75. {
  76. int L=rank[i],R=rank[j];
  77. if(L>R) swap(L,R);
  78. L++;//注意这里
  79. return RMQ(L,R);
  80. }
  81. }sa;
  82. /****************************************后缀数组模板****************************************/
  83.  
  84. int main(){
  85. // freopen("in.txt","r",stdin);
  86. while(scanf("%s%s",s1,s2)!=EOF){
  87. int n=strlen(s1);
  88. int m=strlen(s2);
  89. for(int i=;i<n;i++){
  90. sa.s[i]=s1[i];
  91. }
  92. sa.s[n]='$';
  93. for(int i=n;i<n+m;i++){
  94. sa.s[i]=s2[i-n];
  95. }
  96. sa.n=m+n+;
  97. sa.build_sa(MAXN);
  98. sa.build_height();
  99. int maxLCS=-;
  100. for(int i=;i<m+n+;i++){
  101. if(i==){
  102. maxLCS=max(maxLCS,sa.height[i]);
  103. }else{
  104. if((sa.sa[i]-n)*(sa.sa[i-]-n)<)//保证两后缀是来自不同的字符串的
  105. maxLCS=max(maxLCS,sa.height[i]);
  106. }
  107. }
  108. printf("%d\n",maxLCS);
  109. }
  110. return ;
  111. }

Longest Common Substring(最长公共子序列)的更多相关文章

  1. lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)

    Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...

  2. LCS(Longest Common Subsequence 最长公共子序列)

    最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

  3. LCS修改版(Longest Common Subsequence 最长公共子序列)

    题目描述 作为一名情报局特工,Nova君(2号)有着特殊的传达情报的技巧.为了避免被窃取情报,每次传达时,他都会发出两句旁人看来意义不明话,实际上暗号已经暗含其中.解密的方法很简单,分别从两句话里删掉 ...

  4. hdu 1403 Longest Common Substring(最长公共子字符串)(后缀数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=1403 Longest Common Substring Time Limit: 8000/4000 MS (Ja ...

  5. LCS(Longest Common Subsequence)最长公共子序列

    最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题.这与查找最长公共子串的问题不同的地方是:子序列不需要在原序列中占用连续的位置 .最长公共子序列问题是 ...

  6. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解

    版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...

  7. POJ 1458 Common Subsequence(最长公共子序列LCS)

    POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...

  8. HDU 1159 Common Subsequence 最长公共子序列

    HDU 1159 Common Subsequence 最长公共子序列 题意 给你两个字符串,求出这两个字符串的最长公共子序列,这里的子序列不一定是连续的,只要满足前后关系就可以. 解题思路 这个当然 ...

  9. Common Subsequence--poj1458(最长公共子序列)

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43211   Accepted: 17 ...

  10. UVA10100:Longest Match(最长公共子序列)&&HDU1458Common Subsequence ( LCS)

    题目链接:http://blog.csdn.net/u014361775/article/details/42873875 题目解析: 给定两行字符串序列,输出它们之间最大公共子单词的个数 对于给的两 ...

随机推荐

  1. LCA问题第二弹

    LCA问题第二弹 上次用二分的方法给大家分享了对 LCA 问题的处理,各位应该还能回忆起来上次的方法是由子节点向根节点(自下而上)的处理,平时我们遇到的很多问题都是正向思维处理困难而逆向思维处理比较容 ...

  2. Manacher详解

    之前的字符串题解中对Manacher的思想进行了简略的介绍,在这篇文章中,我将会详细的将这个算法的初衷和具体实现理论进行解释.声明一点,这是我个人的理解,可能有不全面之处,望多包涵.在之前的几篇文章中 ...

  3. CentOS7的一些初始化

    默认最小化安装 [root@GVMCET001 ~]# nmtui  设置网络,主机名等 [root@GVMCET001 ~]# yum update 更新系统 SSH [root@GVMCET001 ...

  4. mysql 实验论证 innodb表级锁与行级锁

    innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的. 表锁演示(无索引) Session1: mysql> set autocommit=0; mysql> select * ...

  5. Android忽略文件以及.gitignore规则不生效的可行解决方案

    github官方的忽略规则:https://github.com/github/gitignore/blob/master/Android.gitignore 我司项目中的忽略规则: *.iml .g ...

  6. Redis学习——Redis持久化之RDB备份方式保存数据

    从这一个介绍里面知道,redis比memcache作为缓存数据库强大的地方,一个是支持的数据类型比较多,另一个就是redis持久化功能. 下面就介绍Redis的持久化之RDB! 一:什么是redis的 ...

  7. Happy 2006 poj2773

    Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9049   Accepted: 3031 Descri ...

  8. Easyui后台管理角色权限控制

    最近需要做一个粗略的后台管理的权限,根据用户的等级来加载相应的菜单,控制到子菜单.使用的是Easyui这个框架. 1.我使用的mysql数据库.在这里我就建立四张表,角色表(tb_users),菜单表 ...

  9. 我的第一个python web开发框架(5)——开发前准备工作(了解编码前需要知道的一些常识)

    中午吃饭时间到了,小白赶紧向老菜坐的位置走过去. 小白:老大,中午请你吃饭. 老菜:哈哈...又遇到问题了吧,这次得狠狠宰你一顿才行. 小白:行行行,只要您赏脸,米饭任吃,嘻嘻,我们边走边聊. ... ...

  10. libsvn_subr-1.so.0: undefined symbol: apr_atomic_xchgptr 故障解决

    源码编译安装完成之后,查看svn的安装版本会报以下错误 svn: symbol lookup error: /usr/local/subversion/lib/libsvn_subr-.so.: un ...