http://poj.org/problem?id=2774

题意:给你两串字符,要你找出在这两串字符中都出现过的最长子串.........

思路:先用个分隔符将两个字符串连接起来,再用后缀数组求出height数组的值,找出一个height值最大并且i与i-1的sa值分别在两串字符中就好.....

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. #define min(x,y) x>y? y:x
  6. #define maxn 200010
  7. int dp[maxn][33];
  8. int wa[maxn],wb[maxn],wsf[maxn],wv[maxn],sa[maxn];
  9. int rank[maxn],height[maxn],s[maxn];
  10. char str[maxn],str1[maxn];
  11. int cmp(int *r,int a,int b,int k)
  12. {
  13. return r[a]==r[b]&&r[a+k]==r[b+k];
  14. }
  15. void getsa(int *r,int *sa,int n,int m)
  16. {
  17. int i,j,p,*x=wa,*y=wb,*t;
  18. for(i=0;i<m;i++) wsf[i]=0;
  19. for(i=0;i<n;i++) wsf[x[i]=r[i]]++;
  20. for(i=1;i<m;i++) wsf[i]+=wsf[i-1];
  21. for(i=n-1;i>=0;i--) sa[--wsf[x[i]]]=i;
  22. p=1;
  23. j=1;
  24. for(;p<n;j*=2,m=p)
  25. {
  26. for(p=0,i=n-j;i<n;i++) y[p++]=i;
  27. for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
  28. for(i=0;i<n;i++) wv[i]=x[y[i]];
  29. for(i=0;i<m;i++) wsf[i]=0;
  30. for(i=0;i<n;i++) wsf[wv[i]]++;
  31. for(i=1;i<m;i++) wsf[i]+=wsf[i-1];
  32. for(i=n-1;i>=0;i--) sa[--wsf[wv[i]]]=y[i];
  33. t=x;
  34. x=y;
  35. y=t;
  36. x[sa[0]]=0;
  37. for(p=1,i=1;i<n;i++)
  38. x[sa[i]]=cmp(y,sa[i-1],sa[i],j)? p-1:p++;
  39. }
  40. }
  41. void getheight(int *r,int n)
  42. {
  43. int i,j,k=0;
  44. for(i=1;i<=n;i++) rank[sa[i]]=i;
  45. for(i=0;i<n;i++)
  46. {
  47. if(k)
  48. k--;
  49. else
  50. k=0;
  51. j=sa[rank[i]-1];
  52. while(r[i+k]==r[j+k])
  53. k++;
  54. height[rank[i]]=k;
  55. }
  56. }
  57. int main()
  58. {
  59. while(scanf("%s",str)>0)
  60. {
  61. scanf("%s",str1);
  62. int n=0,len=strlen(str);
  63. for(int i=0;i<len;i++)
  64. s[n++]=str[i]-'a'+1;
  65. s[n++]=28;
  66. len=strlen(str1);
  67. for(int i=0;i<len;i++)
  68. s[n++]=str1[i]-'a'+1;
  69. s[n]=0;
  70. getsa(s,sa,n+1,30);
  71. getheight(s,n);
  72. int maxx=0,pos=0;
  73. len=strlen(str);
  74. for(int i=2;i<n;i++)
  75. if(height[i]>maxx)
  76. {
  77. if(0<=sa[i-1]&&sa[i-1]<len&&len<sa[i])
  78. maxx=height[i];
  79. if(0<=sa[i]&&sa[i]<len&&len<sa[i-1])
  80. maxx=height[i];
  81. }
  82. printf("%d\n",maxx);
  83. }
  84. return 0;
  85. }

poj2774(后缀数组水题)的更多相关文章

  1. POJ2774 & 后缀数组模板题

    题意: 求两个字符串的LCP SOL: 模板题.连一起搞一搞就好了...主要是记录一下做(sha)题(bi)过程心(cao)得(dan)体(xin)会(qing) 后缀数组概念...还算是简单的,过程 ...

  2. Distinct Substrings SPOJ - DISUBSTR(后缀数组水题)

    求不重复的子串个数 用所有的减去height就好了 推出来的... #include <iostream> #include <cstdio> #include <sst ...

  3. BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题

    BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include &l ...

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

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

  5. BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ)

    3172: [Tjoi2013]单词 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 268   Solved: 145 [ Submit][ St ...

  6. Lightoj 1112 - Curious Robin Hood 【单点改动 + 单点、 区间查询】【树状数组 水题】

    1112 - Curious Robin Hood PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 64 MB ...

  7. poj2774 后缀数组2个字符串的最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 26601   Accepted: 10 ...

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

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

  9. 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message

    Language: Default Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 21 ...

随机推荐

  1. SpringMVC使用ModelAndView进行重定向

    1.Servlet重定向forward与redirect: 使用servlet重定向有两种方式,一种是forward,另一种就是redirect.forward是服务器内部重定向,客户端并不知道服务器 ...

  2. php 获得linux 机器的性能

    <?php $str = shell_exec('more /proc/stat'); $pattern = "/(cpu[0-9]? )[\s]+([0-9]+)[\s]+([0-9 ...

  3. [Compose] 17. List comprehensions with Applicative Functors

    We annihilate the need for the ol' nested for loop using Applicatives. For example we have this kind ...

  4. 【Python】安装Python的mysql模块

    在控制台中输入pip install pymysql即可,以下是输出: C:\Users\horn1\Desktop\python\15>pip install pymysql Collecti ...

  5. 在linux下安装mysql

    1.下载mysql 下载地址: http://dev.mysql.com/downloads/mysql/5.5.html#downloads 2.进入系统后,检测是否安装mysql #rpm -qa ...

  6. Java静态变量的初始化(static块的本质)

    Java静态变量的初始化(static块的本质) 标签: javaclassstring编译器jdk工作 2010-02-06 07:23 33336人阅读 评论(16) 收藏 举报  分类: Jav ...

  7. 【bat】通过for循环复制一张图片100次

    代码如下: @echo off set "F=1" cd C:\Users\Thinkpad\Desktop\img for /L %%F IN (1,1,100) DO COPY ...

  8. 【Linux】cat命令

    用途 cat用于将一个档案的内容连续的打印在屏幕上 全称 cat的全称是Conctaenate 参数 -A :相当于-vTE的整合选项,可列出一些特殊字符而不是空白而已 -b :列出行号,仅针对非空白 ...

  9. C# 实体集合和实体转换成相应的string、XDocument、XElement、XDocument

    https://msdn.microsoft.com/zh-cn/library/system.xml.linq.xelement(v=vs.110).aspx XElement.Parse 方法 ( ...

  10. js同域名下不同文件下使用coookie

    //写cookies function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.get ...