把s1,s2拼接,求Height。相邻的Height判断左右串起点是否在两个串中,另外对Height和s1.length()-SA[i-1]取min。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <string>
  4. #include <queue>
  5. #include <vector>
  6. #include <map>
  7. #include <set>
  8. #include <stack>
  9. #include <cmath>
  10. #include <cstdio>
  11. #include <algorithm>
  12. #include <iomanip>
  13. #include <stdlib.h>
  14. #include <time.h>
  15. #define LL long long
  16. using namespace std;
  17. const LL mod = ;
  18. const LL N = ;
  19. int s1l, s2l;
  20. class SF
  21. {
  22. //N:数组大小
  23. public:
  24. int x[N], y[N], c[N];
  25. int Height[N],str[N], SA[N], Rank[N];//Height数组从2开始
  26. int slen;
  27. int m=;//字符集处理大小(传入如果不是数字,需要做位移转换)
  28. bool cmp(int* r, int a, int b, int l) {
  29. return r[a] == r[b] && r[a + l] == r[b + l];
  30. }
  31.  
  32. void Suffix(int n) {
  33. ++n;
  34. int i, j, p;
  35. for (i = ; i < m; ++i) c[i] = ;
  36. for (i = ; i < n; ++i) c[x[i] = str[i]]++;
  37. for (i = ; i < m; ++i) c[i] += c[i - ];
  38. for (i = n - ; i >= ; --i) SA[--c[x[i]]] = i;
  39. for (j = ; j <= n; j <<= ) {
  40. p = ;
  41. for (i = n - j; i < n; ++i) y[p++] = i;
  42. for (i = ; i < n; ++i) if (SA[i] >= j) y[p++] = SA[i] - j;
  43. for (i = ; i < m; ++i) c[i] = ;
  44. for (i = ; i < n; ++i) c[x[y[i]]]++;
  45.  
  46. for (i = ; i < m; ++i) c[i] += c[i - ];
  47. for (i = n - ; i >= ; --i) SA[--c[x[y[i]]]] = y[i];
  48.  
  49. swap(x, y);
  50. p = ; x[SA[]] = ;
  51. for (i = ; i < n; ++i) {
  52. x[SA[i]] = cmp(y, SA[i - ], SA[i], j) ? p - : p++;
  53. }
  54. if (p >= n)break;
  55. m = p;
  56. }
  57.  
  58. int k = ;
  59. n--;
  60. for (i = ; i <= n; ++i) Rank[SA[i]] = i;
  61. for (i = ; i < n; ++i) {
  62. if (k)--k;
  63. j = SA[Rank[i] - ];
  64. while (str[i + k] == str[j + k])++k;
  65. Height[Rank[i]] = k;
  66. //cout << k << endl;
  67. }
  68. }
  69. void init(string s)//不论什么参数,用引用传入
  70. {
  71. slen = s.length();
  72. for (int i = ; i < slen; i++)
  73. str[i] =s[i]-'a'+;//如果是字符,映射成从1开始的序列
  74. str[slen] = ;//0作为结束符,防止越界
  75. Suffix(slen);
  76. }
  77. LL solve()
  78. {
  79. int ans = ;
  80. for (int i = ; i <= slen; i++)
  81. {
  82. int sa1 = SA[i - ],sa2=SA[i];
  83. if (sa1 > sa2) swap(sa1, sa2);
  84. if (sa1 >= s1l || sa2 < s1l) continue;
  85. ans = max(ans, min(s1l - sa1, Height[i]));
  86. }
  87. return ans;
  88. }
  89. }sf;
  90. LL dp[][];
  91. LL n;
  92. int main() {
  93. cin.sync_with_stdio(false);
  94. string s1,s2;
  95. while (cin >> s1>>s2)
  96. {
  97. s1l = s1.length();
  98. s2l = s2.length();
  99. sf.init(s1+s2);
  100. cout << sf.solve() << endl;
  101. }
  102. return ;
  103. }

hihocoder-1415 后缀数组三·重复旋律3 两个字符串的最长公共子串的更多相关文章

  1. hihocoder #1415 : 后缀数组三·重复旋律3

    #1415 : 后缀数组三·重复旋律3 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...

  2. hiho一下122周 后缀数组三·重复旋律

    后缀数组三·重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...

  3. hihoCoder 1403 后缀数组一·重复旋律(后缀数组+单调队列)

    #1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...

  4. hihocoder #1419 : 后缀数组四·重复旋律4

    #1419 : 后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构 ...

  5. hihocoder #1407 : 后缀数组二·重复旋律2

    #1407 : 后缀数组二·重复旋律2 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...

  6. HiHocoder1415 : 后缀数组三·重复旋律3 & Poj2774:Long Long Message

    题面 HiHocoder1415 Poj2774 Sol 都是求最长公共子串,\(hihocoder\)上讲的很清楚 把两个串拼在一起,中间用一个特殊字符隔开 那么答案就是排序后相邻两个不同串的后缀的 ...

  7. poj 2774 后缀数组 两个字符串的最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 31904   Accepted: 12 ...

  8. SPOJ 1811 Longest Common Substring (后缀自动机第一题,求两个串的最长公共子串)

    题目大意: 给出两个长度小于等于25W的字符串,求它们的最长公共子串. 题目链接:http://www.spoj.com/problems/LCS/ 算法讨论: 二分+哈希, 后缀数组, 后缀自动机. ...

  9. hihocoder1415 后缀数组三·重复旋律3

    传送门:http://hihocoder.com/problemset/problem/1415 [题解] 考虑求出两串合在一起(中间加分隔符)后缀数组,就是要求任意在两个串中的$i, j$,$\mi ...

随机推荐

  1. 在Linux系统上卸载playOnLinux

    1.remove just the playonlinux package itself. sudo apt-get remove playonlinux 2.remove the playonlin ...

  2. uniGUI试用笔记(六)

    uniGUI提供了一个文件上传控件TUniFileUpload,进行数据的导入就变得比较容易.首先将TUniFileUpload控件放置在窗体上,按下导入按钮后,执行TUniFileUpload的文件 ...

  3. Firemonkey的几个特色属性(二)

    3.RotationAngle 控件的旋转角度,可以通过TAnimation进行角度旋转控制. 4.RotationCenter 控件旋转的中心位置,从(0,0)到(1,1),缺省是(0.5,0.5) ...

  4. How to Use GNOME Shell Extensions

    如果没有安装Tweaks请先安装,命令如下: sudo apt install gnome-tweak-tool 1. Use gnome-shell-extensions package [easi ...

  5. 【做题】CF285E. Positions in Permutations——dp+容斥

    题意:求所有长度为\(n\)的排列\(p\)中,有多少个满足:对于所有\(i \,(1 \leq i \leq n)\),其中恰好有\(k\)个满足\(|p_i - i| = 1\).答案对\(10^ ...

  6. 简单的栈溢出demo

    Code package startnow; /** * @auther draymonder */ public class StackOverFlowTest { public static vo ...

  7. P3810 【模板】三维偏序(陌上花开)(cdq分治)

    思路 看到这种偏序类的题目,而且不要求强制在线,可以立刻想到cdq分治 注意这题有一个问题,就是询问的是小于等于而不是小于,如果相等的话两个元素会相互贡献,而cdq的特点是右区间不能对左边有影响,所以 ...

  8. webpack插件配置(二)- HtmlWebpackPlugin

    作用 简化Html文件的创建,以便为你的webpack bundle包提供服务.这对于在文件名中包含每次会随着编译而发生变化的hash的webpack bundle尤其有用.插件可以生成一个HTML文 ...

  9. Idea中配置Tomcat

    配置步骤 在idea项目左上角选择‘Edit Configurations’ 2. 配置server 3. 配置项目 4. 配置成功后就可以在项目下面看到tomcat了 运行Tomcat遇到权限问题: ...

  10. ECharts配置项之title(标题)

    1.标题居中 //left的值为'left', 'center', 'right' title:{ left:'center' } 2.主副标题之间的间距 title:{ //默认为10 itemGa ...