POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)
题目链接 POJ2774
SPOJ1811 LCS - Longest Common Substring
比后缀自动机慢好多(废话→_→)。
\(Description\)
求两个字符串最长公共子串
\(Solution\)
任何一个子串一定是某个后缀的前缀
可以将两个字符串拼在一起,中间用一个从未出现过的字符隔开,这样ht[]的最大值就是答案?
不一定,最大的ht[]可能是由同一个字符串得到的,判一下属于哪个字符串即可
//3772K 516MS
//SPOJ:26M 0.11s(N=5e5)
#include <cstdio>
#include <cstring>
#include <algorithm>
const int N=2e5+10;int n,l,sa[N],rk[N],ht[N],sa2[N],tm[N];
char s[N];void Get_SA()
{int *x=rk,*y=sa2,m=30;for(int i=1; i<=n; ++i) ++tm[x[i]=s[i]-'a'+1];for(int i=1; i<=m; ++i) tm[i]+=tm[i-1];for(int i=n; i; --i) sa[tm[x[i]]--]=i;for(int p=0,k=1; k<n; m=p,p=0,k<<=1){for(int i=n-k+1; i<=n; ++i) y[++p]=i;for(int i=1; i<=n; ++i) if(sa[i]>k) y[++p]=sa[i]-k;for(int i=0; i<=m; ++i) tm[i]=0;for(int i=1; i<=n; ++i) ++tm[x[i]];for(int i=1; i<=m; ++i) tm[i]+=tm[i-1];for(int i=n; i; --i) sa[tm[x[y[i]]]--]=y[i];std::swap(x,y), p=x[sa[1]]=1;for(int i=2; i<=n; ++i)x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p:++p;if(p>=n) break;}for(int i=1; i<=n; ++i) rk[sa[i]]=i;ht[1]=0;for(int k=0,p,i=1; i<=n; ++i){if(rk[i]==1) continue;if(k) --k;p=sa[rk[i]-1];while(i+k<=n&&p+k<=n&&s[i+k]==s[p+k]) ++k;ht[rk[i]]=k;}
}int main()
{scanf("%s",s+1), l=strlen(s+1);s[l+1]='z'+1;scanf("%s",s+2+l), n=strlen(s+1);Get_SA();int res=0;for(int i=2; i<=n; ++i)if((sa[i]<=l)^(sa[i-1]<=l)) res=std::max(res,ht[i]);printf("%d",res);return 0;
}
转载于:https://www.cnblogs.com/SovietPower/p/8569707.html
POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)相关推荐
- spoj 1811 LCS 后缀自动机
A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...
- SPOJ 1811 LCS [后缀自动机]
题意: 求两个串的最大连续子串 一个串建SAM,另一个串在上面跑 注意如果走了Suffix Link,sum需要更新为t[u].val+1 Suffix Link有点像失配吧,当前状态s走不了了就到S ...
- SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和
SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和 Code: #include <cstdio> #include <algorithm> #include < ...
- POJ 2774 Long Long Message SP1811 LCS - Longest Common Substring 题解
POJ:题目传送门 洛谷:题目传送门 题目大意: 求两个字符串的最长公共子串长度. 题解 后缀数组入门题,将两个字符串接在一起,中间用一个字符集以外的字符隔开,然后求出 h e i g h t hei ...
- SPOJ 1811 LCS,SPOJ 1812 LCS2【SAM裸题,clj的ppt很清楚
反正clj的ppt都讲了 - LCS的话--因为只需要匹配一次,也就不需要更新pre的值了. - 然而LCS2--因为有多个字符串要匹配,于是要把整个SAM上的rec都更新了,所以多了一步从后往前更新 ...
- POJ - 2774 Long Long Message(后缀数组)
题目链接:点击查看 题目大意:给出两个字符串,求出其最长的公共子串 题目分析:后缀数组水题,直接用一个不同的符号拼接一下两个字符串,然后跑出height数组和sa数组,再遍历一遍取最大值就是答案了,需 ...
- SPOJ 694/705 后缀数组
思路: 论文题*n Σn-i-ht[i]+1 就是结果 O(n)搞定~ //By SiriusRen #include <cstdio> #include <cstring> ...
- 【POJ2774】Long Long Message,第一次的后缀数组
Time:2016.05.21 Author:xiaoyimi 转载注明出处谢谢 传送门 思路:没什么值得说的,大家想看思路的话还是去看大牛们的吧,磨了将近一天的后缀数组,基本按照模板打得,最后发现有 ...
- POJ 1159 Palindrome(字符串变回文:LCS)
POJ 1159 Palindrome(字符串变回文:LCS) http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要在该字符串中插入几个字符能是的它变 ...
最新文章
- day6 面向对象基础
- JaveWeb学习之Servlet(二):ServletConfig和ServletContext
- 到你是你玩互联网还是互联网玩了你
- Swift基础学习(二)数据类型
- java 找不到符号 con_我的java程序运行时,提示找不到符号,求解!
- Unix整理笔记——安全性——里程碑M13
- std::map的使用
- Pandas读取excel数据——pearson相关性分析
- coldfusion_ColdFusion破坏神话
- JAVA漫天星星之菱形
- 圆方树学习笔记 例题 uoj30 Tourists
- 9.Pandas练习:美国个州的统计数据
- Flutter 实现切角渐变矩形
- Super Hide IP 3.4.7.8允许您以匿名方式进行网上冲浪、 保持隐藏您的 IP 地址
- 企业战略 平台转型:不走寻常路
- webpack entry入口
- google的fav icon变了
- python3利用pandas读取excel的列取出最大最小值
- heritrix参考文献
- 极大似然估计的理解 为什么要取似然函数最大值 似然函数的意义是什么?
热门文章
- postgis数据库优化_PostgreSQL批量导入性能优化
- android 图片存sd卡上,android打开,保存图片到sd卡,显示图片
- python 银行工作_Python:银行系统实战(一)
- java annotation应用_java Annotation的应用
- 多生产者_你是生产者还是消费者?这决定了你的层次。
- 《Java 高并发》01 高并发基本概念
- java数据类型及其说明
- 听说你对 ES6 class 类还不是很了解
- Android 中的LayoutInflater的理解
- Netflix推荐系统(Part two)-系统架构