SPOJ 1811. POJ 2774 . 最大公共子串
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 . 最大公共子串相关推荐
- POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)
题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...
- SPOJ - PHRASES Relevant Phrases of Annihilation —— 后缀数组 出现于所有字符串中两次且不重叠的最长公共子串...
题目链接:https://vjudge.net/problem/SPOJ-PHRASES PHRASES - Relevant Phrases of Annihilation no tags You ...
- SPOJ1812(后缀自动机求n个串的最长公共子串)
题目:http://www.spoj.com/problems/LCS2/ 题意:给定n个串,求它们的最长公共子串. 思路就是:先将一个串建SAM,然后用后面的串去匹配,对于每一个串,保存最大值,对于 ...
- SPOJ1811最长公共子串问题(后缀自动机)
题目:http://www.spoj.com/problems/LCS/ 题意:给两个串A和B,求这两个串的最长公共子串. 分析:其实本题用后缀数组的DC3已经能很好的解决,这里我们来说说利用后缀自动 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- POJ 2774 Long Long Message SP1811 LCS - Longest Common Substring 题解
POJ:题目传送门 洛谷:题目传送门 题目大意: 求两个字符串的最长公共子串长度. 题解 后缀数组入门题,将两个字符串接在一起,中间用一个字符集以外的字符隔开,然后求出 h e i g h t hei ...
- 【动态规划】最长公共子序列与最长公共子串
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 9.69最长公共子串
最长公共子串 #include<iostream> #include<cstring> using namespace std; char a[200] = "AAC ...
- java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现
关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...
最新文章
- NFS服务器设置及mount命令挂载
- Linux下如何简单删除/data的空目录
- android ui布局适配,Android适配全面总结(一)----屏幕适配
- QT qml---- loader使用方法
- [转] apache配置rewrite及.htaccess文件
- 鸿蒙系统董事长,鸿蒙2.0已开源 华为轮值董事长:今年至少3亿设备搭载鸿蒙系统...
- 推荐好用的JavaScript模块
- LSTM模型结合LDA对序列性文本建模 阅读笔记 2017 ICML
- 大佬应该都懂的python语法,看看哪些是你不知道的?
- 虚拟化整合实现1+1大于2的效果
- android studio 全局变量和变量保存到xml文件的方法及应用
- 机器视觉科学计算可视化_模因视觉:对模因进行分类的科学
- centos 网络流量监控方法总结
- 高通WLAN框架学习(22)-- WPA3
- 30分钟java桌球小游戏,30分钟完成桌球小游戏项目
- 微信小程序实现列表及tab标签
- python xy 官网_pythonxy 安装
- ArcGIS Pro二次开发环境配置及项目创建示例
- “有”“无”之间的哲学对话——海德格尔与老庄哲学思想的相互阐释
- 从孙子兵法看企业价值观和企业文化