思路

SPOJ 1812 LCS2 - Longest Common Substring II一个思路,改成两个串就有双倍经验了

代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. using namespace std;
  5. int maxlen[502000],suflink[502000],barrel[502000],trans[502000][26],Nodecnt,ranks[502000];
  6. int New_state(int _maxlen,int *_trans,int _suflink){
  7. ++Nodecnt;
  8. maxlen[Nodecnt]=_maxlen;
  9. if(_trans)
  10. for(int i=0;i<26;i++)
  11. trans[Nodecnt][i]=_trans[i];
  12. suflink[Nodecnt]=_suflink;
  13. return Nodecnt;
  14. }
  15. int add_len(int u,int c){
  16. int z=New_state(maxlen[u]+1,NULL,0);
  17. while(u&&trans[u][c]==0){
  18. trans[u][c]=z;
  19. u=suflink[u];
  20. }
  21. if(!u){
  22. suflink[z]=1;
  23. return z;
  24. }
  25. int v=trans[u][c];
  26. if(maxlen[v]==maxlen[u]+1){
  27. suflink[z]=v;
  28. return z;
  29. }
  30. int y=New_state(maxlen[u]+1,trans[v],suflink[v]);
  31. suflink[v]=suflink[z]=y;
  32. while(u&&trans[u][c]==v){
  33. trans[u][c]=y;
  34. u=suflink[u];
  35. }
  36. return z;
  37. }
  38. void c_sort(int n,int lim){
  39. memset(barrel,0,sizeof(barrel));
  40. for(int i=1;i<=n;i++)
  41. barrel[maxlen[i]]++;
  42. for(int i=1;i<=lim;i++)
  43. barrel[i]+=barrel[i-1];
  44. for(int i=1;i<=n;i++)
  45. ranks[barrel[maxlen[i]]--]=i;
  46. }
  47. int mx[502000];
  48. char s[502000];
  49. int main(){
  50. // freopen("test.in","r",stdin);
  51. int cnt=0,last=1;
  52. Nodecnt=1;
  53. int len;
  54. scanf("%s",s+1);
  55. len=strlen(s+1);
  56. for(int i=1;i<=len;i++)
  57. last=add_len(last,s[i]-'a');
  58. c_sort(Nodecnt,200010);
  59. scanf("%s",s+1);
  60. len=strlen(s+1);
  61. memset(mx,0,sizeof(mx));
  62. int nowp=1,lent=0;
  63. for(int i=1;i<=len;i++){
  64. if(trans[nowp][s[i]-'a']){
  65. lent++;
  66. nowp=trans[nowp][s[i]-'a'];
  67. }
  68. else{
  69. while(nowp&&trans[nowp][s[i]-'a']==0)
  70. nowp=suflink[nowp];
  71. if(!nowp){
  72. nowp=1;
  73. lent=0;
  74. continue;
  75. }
  76. else{
  77. lent=maxlen[nowp]+1;
  78. nowp=trans[nowp][s[i]-'a'];
  79. }
  80. }
  81. mx[nowp]=max(mx[nowp],lent);
  82. }
  83. for(int i=Nodecnt;i>=1;i--){
  84. int t=ranks[i];
  85. mx[suflink[t]]=min(maxlen[suflink[t]],max(mx[suflink[t]],mx[t]));
  86. }
  87. int ans=0;
  88. for(int i=1;i<=Nodecnt;i++)
  89. ans=max(mx[i],ans);
  90. printf("%d\n",ans);
  91. return 0;
  92. }

SPOJ 1811 LCS - Longest Common Substring的更多相关文章

  1. spoj 1811 LCS - Longest Common Substring (后缀自己主动机)

    spoj 1811 LCS - Longest Common Substring 题意: 给出两个串S, T, 求最长公共子串. 限制: |S|, |T| <= 1e5 思路: dp O(n^2 ...

  2. 【刷题】SPOJ 1811 LCS - Longest Common Substring

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

  3. 后缀自动机(SAM) :SPOJ LCS - Longest Common Substring

    LCS - Longest Common Substring no tags  A string is finite sequence of characters over a non-empty f ...

  4. spoj 1812 LCS2 - Longest Common Substring II (后缀自己主动机)

    spoj 1812 LCS2 - Longest Common Substring II 题意: 给出最多n个字符串A[1], ..., A[n], 求这n个字符串的最长公共子串. 限制: 1 < ...

  5. spoj1811 LCS - Longest Common Substring

    地址:http://www.spoj.com/problems/LCS/ 题面: LCS - Longest Common Substring no tags  A string is finite ...

  6. SPOJ 10570 LONGCS - Longest Common Substring

    思路 和SPOJ 1812 LCS2 - Longest Common Substring II一个思路,改成多组数据就有三倍经验了 代码 #include <cstdio> #inclu ...

  7. 【SP1811】LCS - Longest Common Substring

    [SP1811]LCS - Longest Common Substring 题面 洛谷 题解 建好后缀自动机后从初始状态沿着现在的边匹配, 如果失配则跳它的后缀链接,因为你跳后缀链接到达的\(End ...

  8. SPOJ LCS Longest Common Substring 和 LG3804 【模板】后缀自动机

    Longest Common Substring 给两个串A和B,求这两个串的最长公共子串. no more than 250000 分析 参照OI wiki. 给定两个字符串 S 和 T ,求出最长 ...

  9. 【SPOJ】1812. Longest Common Substring II(后缀自动机)

    http://www.spoj.com/problems/LCS2/ 发现了我原来对sam的理解的一个坑233 本题容易看出就是将所有匹配长度记录在状态上然后取min后再对所有状态取max. 但是不要 ...

随机推荐

  1. LeetCode 705 Design HashSet 解题报告

    题目要求 Design a HashSet without using any built-in hash table libraries. To be specific, your design s ...

  2. CF653F Paper task

    题目链接:洛谷 首先我们不考虑本质不同这个限制. 既然不能直接用栈乱搞,我们就可以用一个前缀和的套路了. 我们将(设为1,将)设为-1,记前缀和为$s_i$,则$[i,j]$这一段是回文子串当且仅当 ...

  3. 解读socketserver源码

    解读python中SocketServer源码 再看继承 真正的大餐来之前,还是来点儿开胃菜!回顾一下关于类的继承的知识:    我们先看上面的代码,这是一个简单的类继承,我们可以看到父类Base和子 ...

  4. tesseract库

    1.简介 # -*-coding:utf8 -*- #图形验证码识别技术 ''' 阻碍我们爬虫的,有时候是在登录或者请求一些数据时候的图形验证码.因此这里我们讲解 一种能将图片翻译成文字的技术.将图片 ...

  5. iOS与H5交互(WKWbebView)

    前言: 在iOS开发中,或多或少的会嵌入一些H5页面,有时候需要原生代码和H5页面进行交互.iOS8开始苹果推出性能更强大的WKWebView,所以一下方法是关于WKWebView与JS的交互. 创建 ...

  6. 利用MathType为公式编号并引用

    序言 在理工科的论文撰写过程中, 公式编辑.编号以及引用非常普遍, 但是笔者没有发现word本身对公式编号和引用有比较好的支持, 所以只好求助于第三方插件. MathType在公式编辑方面表现比较出色 ...

  7. MATLAB算术运算符和常用函数

    1 算术运算符 Matlab中的算术运算符按优先级由高到低为: (1) ^           幂 (2) *            乘      /            右除(正常除)       ...

  8. window系统下搭建本地的NuGet Server

    1. NuGet.Config文件所在的目录: C:\Users\xxx\AppData\Roaming\NuGet 2.将nupkg为结尾的文件放在 项目的Packages目录下.(注意是和web. ...

  9. 用HTML5+原生js实现的推箱子游戏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. linux 邮件服务器—Extmail

    环境: Centos 6.5 :172.16.9.13 (DNS 服务器) Centos 6.5: 172.16.9.11 (postfix 邮件服务器) 安装软件: yum -y install p ...