题意:给你两个字符串。求最长公共字串的长度。

by:罗穗骞模板

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <algorithm>
  5. using namespace std;
  6. #define M 303
  7. #define inf 0x3fffffff
  8. #define maxn 500000
  9. #define ws ww
  10. #define rank RANK
  11. #define F(x) ((x)/3+((x)%3==1?0:tb))
  12. #define G(x) ((x)<tb?
  13.  
  14. (x)*3+1:((x)-tb)*3+2)
  15. int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
  16. int r[maxn],sa[maxn];
  17. int cmp(int *r,int a,int b,int l)
  18. {
  19. return r[a]==r[b]&&r[a+l]==r[b+l];
  20. }
  21. void da(int *r,int *sa,int n,int m)
  22. {
  23. int i,j,p,*x=wa,*y=wb,*t;
  24. for(i=0;i<m;i++) ws[i]=0;
  25. for(i=0;i<n;i++) ws[x[i]=r[i]]++;
  26. for(i=1;i<m;i++) ws[i]+=ws[i-1];
  27. for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;
  28. for(j=1,p=1;p<n;j*=2,m=p)
  29. {
  30. for(p=0,i=n-j;i<n;i++) y[p++]=i;
  31. for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
  32. for(i=0;i<n;i++) wv[i]=x[y[i]];
  33. for(i=0;i<m;i++) ws[i]=0;
  34. for(i=0;i<n;i++) ws[wv[i]]++;
  35. for(i=1;i<m;i++) ws[i]+=ws[i-1];
  36. for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];
  37. for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
  38. x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
  39. }
  40. return;
  41. }
  42. int rank[maxn],height[maxn];
  43. void calheight(int *r,int *sa,int n)
  44. {
  45. int i,j,k=0;
  46. for(i=1;i<=n;i++)
  47. rank[sa[i]]=i;
  48. for(i=0;i<n;height[rank[i++]]=k)
  49. for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
  50. return;
  51. }
  52. char str[maxn];
  53. int main()
  54. {
  55. gets(str);
  56. int len1;
  57. len1=strlen(str);
  58. str[len1]='$';
  59. gets(str+len1+1);
  60. int len=strlen(str);
  61. for(int i=0;i<len;i++)
  62. r[i]=str[i];
  63. da(r,sa,len+1,128);
  64. calheight(r,sa,len);
  65. int ans=0;
  66. for(int i=1;i<len;i++)
  67. {
  68. if((sa[i-1]<len1&&sa[i]>=len1)||(sa[i-1]>=len1&&sa[i]<len1))
  69. ans=max(ans,height[i]);
  70. }
  71. printf("%d\n",ans);
  72. return 0;
  73. }

PKU 2774 Long Long Message (后缀数组练习模板题)的更多相关文章

  1. POJ 2774 Long Long Message 后缀数组

    Long Long Message   Description The little cat is majoring in physics in the capital of Byterland. A ...

  2. poj 2774 Long Long Message 后缀数组基础题

    Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 24756   Accepted: 10130 Case Time Limi ...

  3. poj 2774 Long Long Message 后缀数组LCP理解

    题目链接 题意:给两个长度不超过1e5的字符串,问两个字符串的连续公共子串最大长度为多少? 思路:两个字符串连接之后直接后缀数组+LCP,在height中找出max同时满足一左一右即可: #inclu ...

  4. POJ 2774 Long Long Message 后缀数组模板题

    题意 给定字符串A.B,求其最长公共子串 后缀数组模板题,求出height数组,判断sa[i]与sa[i-1]是否分属字符串A.B,统计答案即可. #include <cstdio> #i ...

  5. POJ 2774 Long Long Message (后缀数组+二分)

    题目大意:求两个字符串的最长公共子串长度 把两个串接在一起,中间放一个#,然后求出height 接下来还是老套路,二分出一个答案ans,然后去验证,如果有连续几个位置的h[i]>=ans,且存在 ...

  6. POJ - 2774 Long Long Message (后缀数组/后缀自动机模板题)

    后缀数组: #include<cstdio> #include<algorithm> #include<cstring> #include<vector> ...

  7. POJ 2774 Long Long Message ——后缀数组

    [题目分析] 用height数组RMQ的性质去求最长的公共子串. 要求sa[i]和sa[i-1]必须在两个串中,然后取height的MAX. 利用中间的字符来连接两个字符串的思想很巧妙,记得最后还需要 ...

  8. 后缀数组Da模板+注释 以及 dc3模板

    后缀数组Da模板: 1 /* 2 后缀数组倍增法Da板子 3 */ 4 #include <cstdlib> 5 #include <cstring> 6 #include & ...

  9. (HDU 5558) 2015ACM/ICPC亚洲区合肥站---Alice's Classified Message(后缀数组)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5558 Problem Description Alice wants to send a classi ...

随机推荐

  1. ACM_招新笔试题系列——买包子

    招新笔试题系列——买包子 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小华刚到大学,一天早上她替她室友买早餐,一共要N个包子. ...

  2. 下载谷歌地图封锁IP解决办法

    采用重新拨号,动态改变IP的方式.可以使用软件<易好用IP自动更换软件>

  3. Java系列学习(十四)-集合

    1.java中的集合学习 2.Collection中常用方法 1.添加功能 boolean add(E e):添加一个元素 boolean addAll(Collection<? extends ...

  4. Angular——表单指令

    基本介绍 这些指定只能针对input标签 基本使用 <!DOCTYPE html> <html lang="en"> <head> <me ...

  5. JS高级——沙箱

    基本概念 1.沙箱:与外界隔绝的一个环境,外界无法修改该环境内任何信息,沙箱内的东西单独属于一个世界 2.苹果手的app使用的就是沙箱模式去运行,隔离app的空间,每个app独立运行 js沙箱基本模式 ...

  6. 学习java编程能往哪些方向发展

    当下Java训练非常热,是因为通过学习java能够快速的就业,这对于今年就业压力非常大的大学生来说,无疑是一条就业的捷路,虽然培教育费动辄过万,但还是非常值得的. 可是你可曾想过,学习了java编程后 ...

  7. 从ABC到流利口语-unit01

    Unit 1 Introduction1 Good evening,everyone.It's a pleasure to you all. My name is Wang Dong.I'M from ...

  8. std::vector遍历

    std::vector是我在标准库中实用最频繁的容器.总结一下在遍历和创建vector时需要注意的一些地方. 在不考虑线程安全问题的前提下,在C++11中有五种遍历方式. 方式一 for (size_ ...

  9. C3P0数据库连接池使用方法

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  10. 小白年薪24万,为什么Linux运维工程师薪资这么高?

    借了云计算的东风,Linux岗位这几年是越来越火,特别是Linux云计算运维工程师,如今早已成为互联网的核心岗位之一,薪资待遇飞快的上涨. 作为一个细分的专业岗位,Linux云计算工程师由于其入门学习 ...