Description

给出两个字符串 a,b ,求 a 和 b 的最大公共子串,字符串长度为 500000。

Solution

  • 可以用后缀数组做,将两个字符串接起来,中间用特殊的分隔符相连。

  • 求出 Height 数组之后,就可以利用 Height 数组的性质进行计算了!

  • 对于一个 ii ,如果 sa[i]sa[i] 和 sa[i−1]sa[i-1] 的位置分别属于 aa 和 bb ,那么 height[i]height[i] 就是合法的。

  • 求最大值即可。时间复杂度 O(N log N)O(N\ log\ N) 。

Code

#include<cstdio>
using namespace std;
const int N=5e5+5;
int n,m=27,len,ans;
int sa[N],rank[N],r1[N],height[N],tax[N];
int s[N];
inline void readln()
{char ch=getchar();while(ch<'a' || ch>'z') ch=getchar();while(ch>='a' && ch<='z') s[++n]=ch-'a'+1,ch=getchar();
}
inline void csort()
{for(int i=1;i<=m;i++) tax[i]=0;for(int i=1;i<=n;i++) tax[rank[i]]++;for(int i=1;i<=m;i++) tax[i]+=tax[i-1];for(int i=n;i;i--) sa[tax[rank[r1[i]]]--]=r1[i];
}
inline void SA()
{for(int i=1;i<=n;i++) rank[r1[i]=i]=s[i];csort();for(int j=1,p=0;j<=n;j<<=1,m=p,p=0){for(int i=n-j+1;i<=n;i++) r1[++p]=i;for(int i=1;i<=n;i++)if(sa[i]>j) r1[++p]=sa[i]-j;csort();for(int i=1;i<=n;i++) r1[i]=rank[i];rank[sa[1]]=p=1;for(int i=2;i<=n;i++)rank[sa[i]]=(r1[sa[i]]==r1[sa[i-1]] && r1[sa[i]+j]==r1[sa[i-1]+j])?p:++p;}for(int i=1,lcp=0;i<=n;height[rank[i++]]=lcp){if(lcp) lcp--;while(s[i+lcp]==s[sa[rank[i]-1]+lcp]) lcp++;}
}
int main()
{readln(),s[len=++n]=m,readln(),SA();for(int i=2;i<=n;i++)if(height[i]>ans && sa[i]<len^sa[i-1]<len) ans=height[i];printf("%d",ans);return 0;
}

SPOJ 1811. POJ 2774 . 最大公共子串相关推荐

  1. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)

    题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...

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

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

  3. SPOJ1812(后缀自动机求n个串的最长公共子串)

    题目:http://www.spoj.com/problems/LCS2/ 题意:给定n个串,求它们的最长公共子串. 思路就是:先将一个串建SAM,然后用后面的串去匹配,对于每一个串,保存最大值,对于 ...

  4. SPOJ1811最长公共子串问题(后缀自动机)

    题目:http://www.spoj.com/problems/LCS/ 题意:给两个串A和B,求这两个串的最长公共子串. 分析:其实本题用后缀数组的DC3已经能很好的解决,这里我们来说说利用后缀自动 ...

  5. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  6. POJ 2774 Long Long Message SP1811 LCS - Longest Common Substring 题解

    POJ:题目传送门 洛谷:题目传送门 题目大意: 求两个字符串的最长公共子串长度. 题解 后缀数组入门题,将两个字符串接在一起,中间用一个字符集以外的字符隔开,然后求出 h e i g h t hei ...

  7. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  8. 9.69最长公共子串

    最长公共子串 #include<iostream> #include<cstring> using namespace std; char a[200] = "AAC ...

  9. java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现

    关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...

最新文章

  1. NFS服务器设置及mount命令挂载
  2. Linux下如何简单删除/data的空目录
  3. android ui布局适配,Android适配全面总结(一)----屏幕适配
  4. QT qml---- loader使用方法
  5. [转] apache配置rewrite及.htaccess文件
  6. 鸿蒙系统董事长,鸿蒙2.0已开源 华为轮值董事长:今年至少3亿设备搭载鸿蒙系统...
  7. 推荐好用的JavaScript模块
  8. LSTM模型结合LDA对序列性文本建模 阅读笔记 2017 ICML
  9. 大佬应该都懂的python语法,看看哪些是你不知道的?
  10. 虚拟化整合实现1+1大于2的效果
  11. android studio 全局变量和变量保存到xml文件的方法及应用
  12. 机器视觉科学计算可视化_模因视觉:对模因进行分类的科学
  13. centos 网络流量监控方法总结
  14. 高通WLAN框架学习(22)-- WPA3
  15. 30分钟java桌球小游戏,30分钟完成桌球小游戏项目
  16. 微信小程序实现列表及tab标签
  17. python xy 官网_pythonxy 安装
  18. ArcGIS Pro二次开发环境配置及项目创建示例
  19. “有”“无”之间的哲学对话——海德格尔与老庄哲学思想的相互阐释
  20. 从孙子兵法看企业价值观和企业文化

热门文章

  1. Linux下远程连接断开后如何让程序继续运行
  2. ubuntu下文件名乱码的解决办法
  3. MATLAB2017 on winserver2012 第48周运行日志
  4. 无盘服务器怎么修改ip,怎么进入无盘服务器修改IP地址呢
  5. redis常用命令getex_Redis常用命令(key、string、List)
  6. 3DSlicer3:模块管理(一)颜色、DCM、数据、模型、注释
  7. OpenGL编程指南11:组合运动示例2—创建机器人手臂模型
  8. VTK修炼之道80:VTK开发基础_智能指针与引用计数
  9. Delphi中TWebBrowser中注入Js
  10. sql字符串分隔函数