题目链接 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(后缀数组 倍增)相关推荐

  1. spoj 1811 LCS 后缀自动机

    A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...

  2. SPOJ 1811 LCS [后缀自动机]

    题意: 求两个串的最大连续子串 一个串建SAM,另一个串在上面跑 注意如果走了Suffix Link,sum需要更新为t[u].val+1 Suffix Link有点像失配吧,当前状态s走不了了就到S ...

  3. SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和

    SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和 Code: #include <cstdio> #include <algorithm> #include < ...

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

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

  5. SPOJ 1811 LCS,SPOJ 1812 LCS2【SAM裸题,clj的ppt很清楚

    反正clj的ppt都讲了 - LCS的话--因为只需要匹配一次,也就不需要更新pre的值了. - 然而LCS2--因为有多个字符串要匹配,于是要把整个SAM上的rec都更新了,所以多了一步从后往前更新 ...

  6. POJ - 2774 Long Long Message(后缀数组)

    题目链接:点击查看 题目大意:给出两个字符串,求出其最长的公共子串 题目分析:后缀数组水题,直接用一个不同的符号拼接一下两个字符串,然后跑出height数组和sa数组,再遍历一遍取最大值就是答案了,需 ...

  7. SPOJ 694/705 后缀数组

    思路: 论文题*n Σn-i-ht[i]+1 就是结果 O(n)搞定~ //By SiriusRen #include <cstdio> #include <cstring> ...

  8. 【POJ2774】Long Long Message,第一次的后缀数组

    Time:2016.05.21 Author:xiaoyimi 转载注明出处谢谢 传送门 思路:没什么值得说的,大家想看思路的话还是去看大牛们的吧,磨了将近一天的后缀数组,基本按照模板打得,最后发现有 ...

  9. POJ 1159 Palindrome(字符串变回文:LCS)

    POJ 1159 Palindrome(字符串变回文:LCS) http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要在该字符串中插入几个字符能是的它变 ...

最新文章

  1. day6 面向对象基础
  2. JaveWeb学习之Servlet(二):ServletConfig和ServletContext
  3. 到你是你玩互联网还是互联网玩了你
  4. Swift基础学习(二)数据类型
  5. java 找不到符号 con_我的java程序运行时,提示找不到符号,求解!
  6. Unix整理笔记——安全性——里程碑M13
  7. std::map的使用
  8. Pandas读取excel数据——pearson相关性分析
  9. coldfusion_ColdFusion破坏神话
  10. JAVA漫天星星之菱形
  11. 圆方树学习笔记 例题 uoj30 Tourists
  12. 9.Pandas练习:美国个州的统计数据
  13. Flutter 实现切角渐变矩形
  14. Super Hide IP 3.4.7.8允许您以匿名方式进行网上冲浪、 保持隐藏您的 IP 地址
  15. 企业战略 平台转型:不走寻常路
  16. webpack entry入口
  17. google的fav icon变了
  18. python3利用pandas读取excel的列取出最大最小值
  19. heritrix参考文献
  20. 极大似然估计的理解 为什么要取似然函数最大值 似然函数的意义是什么?

热门文章

  1. postgis数据库优化_PostgreSQL批量导入性能优化
  2. android 图片存sd卡上,android打开,保存图片到sd卡,显示图片
  3. python 银行工作_Python:银行系统实战(一)
  4. java annotation应用_java Annotation的应用
  5. 多生产者_你是生产者还是消费者?这决定了你的层次。
  6. 《Java 高并发》01 高并发基本概念
  7. java数据类型及其说明
  8. 听说你对 ES6 class 类还不是很了解
  9. Android 中的LayoutInflater的理解
  10. Netflix推荐系统(Part two)-系统架构