题目描述:

给定两个字符串A和B,求最长公共子串。

算法标签:后缀数组

以下代码:

#include<bits/stdc++.h>
#define il inline
using namespace std;
const int N=2e5+5;char s[N],a[N],b[N];
int n,l1,l2,sa[N],rk[N],height[N],c[N],x[N],y[N],ans;
il void getsa(){int m=128;for(int i=1;i<=n;i++)c[x[i]=s[i]]++;for(int i=2;i<=m;i++)c[i]+=c[i-1];for(int i=n;i;i--)sa[c[x[i]]--]=i;for(int k=1;k<=n;k<<=1){int num=0;for(int i=n-k+1;i<=n;i++)y[++num]=i;for(int i=1;i<=n;i++)if(sa[i]-k>0)y[++num]=sa[i]-k;for(int i=1;i<=m;i++)c[i]=0;for(int i=1;i<=n;i++)c[x[i]]++;for(int i=2;i<=m;i++)c[i]+=c[i-1];for(int i=n;i;i--)sa[c[x[y[i]]]--]=y[i],y[i]=0;swap(x,y);x[sa[1]]=1;num=1;for(int i=2;i<=n;i++)x[sa[i]]=(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k])?num:++num;if(num==n)break;m=num;}for(int i=1;i<=n;i++)rk[sa[i]]=i;
}
il void geth(){int k=0;for(int i=1;i<=n;i++){if(rk[i]==1)continue;if(k)k--;int j=sa[rk[i]-1];while(j+k<=n&&i+k<=n&&s[i+k]==s[j+k])k++;height[rk[i]]=k;}
}
int main()
{scanf(" %s",a+1);scanf(" %s",b+1);l1=strlen(a+1);l2=strlen(b+1);for(int i=1;i<=l1;i++)s[i]=a[i];n=l1;s[++n]='#';for(int i=1;i<=l2;i++)s[++n]=b[i];s[++n]='$';getsa();geth();for(int i=2;i<=n;i++){if((sa[i-1]<=l1&&sa[i]<=l1)||(sa[i-1]>l1+1&&sa[i]>l1+1))continue;ans=max(ans,height[i]);}printf("%d\n",ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/Jessie-/p/10131489.html

2018.12.17-dtoj-1170-最长公共子串相关推荐

  1. SPOJ - PHRASES Relevant Phrases of Annihilation —— 后缀数组 出现于所有字符串中两次且不重叠的最长公共子串...

    题目链接:https://vjudge.net/problem/SPOJ-PHRASES PHRASES - Relevant Phrases of Annihilation no tags  You ...

  2. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  3. 动态规划最常见的习题 (最长公共子串、最长公共子序列、最短编辑距离)

    (1)理论部分: (2)习题: 最长公共子串: 1 package month7.dp; 2 3 //https://www.nowcoder.com/questionTerminal/181a1a7 ...

  4. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)

    动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...

  5. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...

  6. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathi ...

  7. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

  8. 采用顺序结构存储串,设计实现求串S和串T的一个最长公共子串的算法。

    算法分析 先固定字符串str1,取其第一个字符str1[0],(KMP算法)查找str1和str2中有没有以该字符开头的公共子串:即将str[0]与str2中的字符挨个比较,若遇到相等的,再接着比较s ...

  9. 最长公共子串与最长公共子序列

    1. 最长公共子串 要求子串连续,不同于最长公共子序列 def LCS(s1, s2):len1, len2 = len(s1), len(s2)# 匹配矩阵,用来记录两个字符串中所有位置的两个字符之 ...

最新文章

  1. python判断输入类型怎么做_如何检查输入类型?
  2. promise是什么?简单分析promise原理
  3. flutter怎么添加ios网络权限_视频号直播间怎么添加购物车商品;超详细流程步骤。丨国仁网络资讯...
  4. 智能云如何加速产业智能化?百度CTO王海峰2020全球智博会擘画蓝图
  5. K2 Blackpearl中从数据库直接删除流程实例之K2Server表
  6. datagrid 重载本地数据_jQuery easyui datagrid重新加载数据
  7. 剖析Linux内核源码分析《入门技术栈》
  8. 脉冲神经网络 神经元模型-Izhikevich模型(3)
  9. 开源开放 | OMAHA 联合 OpenKG 发布新冠诊疗图谱数据
  10. python 什么是鸭子类型
  11. 拼接播放地址_无极婚礼布置地址,好的婚礼服务多少钱_大伟庆典
  12. html调用properties,聊聊html中的properties和attributes
  13. mysql dump 1449_mysqldump 1449错误解决办法
  14. 信号与槽是如何实现的_Nature | 破解Wnt信号高效远距离传递之谜
  15. 怎么mac ftp服务器文件夹,mac 访问 ftp服务器文件夹权限
  16. Foxmail 7.0中导入地址簿
  17. DES EBC模式前台加密JAVA后台解密
  18. 有刷直流电机工作原理详解
  19. 月圆之夜-体验报告(完稿时间2021/6/11)
  20. C#通过操作注册表检测office版本

热门文章

  1. ubuntu自定义分辨率
  2. [转]Java 对象锁-synchronized()与线程的状态与生命周期
  3. java.lang中String=和equals()函数解析
  4. 好消息,scott的asp.net 2.0数据导航系列全部出版了
  5. GitHub上的私有仓库转换为共有仓库以及共有仓库转换为私有仓库
  6. git push提交时卡住
  7. [Azure] 使用 Visual Studio 2013 管理中国版 Azure 订阅
  8. 广搜最短路径变形,(POJ3414)
  9. IBM 启动网格项目 -- “全球社区网格”,招募志愿者
  10. 【ASP.NET Core】处理异常(下篇)