题意

      给定字符串A、B,求其最长公共子串

  后缀数组模板题,求出height数组,判断sa[i]与sa[i-1]是否分属字符串A、B,统计答案即可。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream> using namespace std; const int maxn = ;
char str[maxn];
int num[maxn];
int wa[maxn], wb[maxn], wv[maxn], sum[maxn];
int rank[maxn], sa[maxn], height[maxn]; bool cmp(int *r, int a, int b, int l)
{
return (r[a] == r[b]) && (r[a+l] == r[b+l]);
} void da(int *r, int *sa, int n, int m)
{
int *x = wa, *y = wb, *t;
for (int i = ; i <= m; ++i)
sum[i] = ;
for (int i = ; i <= n; ++i)
sum[x[i]=r[i]] ++;
for (int i = ; i <= m; ++i)
sum[i] += sum[i-];
for (int i = n; i >= ; --i)
sa[sum[x[i]]--] = i;
for (int i, j = , p = ; p < n; j *= , m = p)
{
for (p = , i = n-j+; i <= n; ++i)
y[++p] = i;
for (i = ; i <= n; ++i)
if (sa[i]-j >= )
y[++p] = sa[i]-j;
for (i = ; i <= n; ++i)
wv[i] = x[y[i]];
for (i = ; i <= m; ++i)
sum[i] = ;
for (i = ; i <= n; ++i)
sum[wv[i]] ++;
for (i = ; i <= m; ++i)
sum[i] += sum[i-];
for (i = n; i >= ; --i)
sa[sum[wv[i]]--] = y[i];
for (t = x, x = y, y = t, p = , x[sa[]] = , i = ; i <= n; ++i)
x[sa[i]] = cmp(y, sa[i], sa[i-], j) ? p : ++p;
}/*
for (int i = 1; i <= n; ++i)
printf("%d ", sa[i]);
printf("\n");*/
} void calheight(int *r, int *sa, int n)
{
for (int i = ; i <= n; ++i)
rank[sa[i]] = i;/*
for (int i = 1; i <= n; ++i)
printf("%d ", rank[i]);
printf("\n");*/
int k = ;
for (int i = ; i <= n; ++i)
{
if (k > )
k --;
int j = sa[rank[i]-];
while (r[i+k] == r[j+k] && i+k <= n && j+k <= n)
k ++;
height[rank[i]] = k;
}
} int main()
{
scanf("%s", str);
int l1 = strlen(str);
for (int i = ; i <= l1; ++i)
num[i] = str[i-]-'a'+;
num[l1+] = ;
scanf("%s", str);
int l2 = strlen(str);
for (int i = ; i <= l2; ++i)
num[l1++i] = str[i-]-'a'+;
da(num, sa, l1+l2+, );
calheight(num, sa, l1+l2+);
int ans = ;
for (int i = ; i <= l1+l2+; ++i)
if ((sa[i] <= l1 && sa[i-] >= l1+)
|| (sa[i-] <= l1 && sa[i] >= l1+))
ans = max(ans, height[i]);
printf("%d\n", ans);
return ;
}

POJ 2774 Long Long Message 后缀数组模板题的更多相关文章

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

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

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

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

  3. POJ 2774 Long Long Message 后缀数组

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

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

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

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

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

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

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

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

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

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

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

  9. POJ2774 & 后缀数组模板题

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

随机推荐

  1. php简单文件管理器——php经典实例

    <html> <head> <title>文件管理</title> <meta charset='utf-8' /> </head&g ...

  2. 宋牧春: Linux设备树文件结构与解析深度分析(1) 【转】

    转自:https://mp.weixin.qq.com/s/OX-aXd5MYlE_YoZ3p32qWA 作者简介 宋牧春,linux内核爱好者,喜欢阅读各种开源代码(uboot.linux.ucos ...

  3. INIT_WORK

    借助runtime pm,在需要使用模块时,增加引用计数(可调用pm_runtime_get),不需要使用时,减少引用计数(可调用pm_runtime_put). 1.INIT_WORK(struct ...

  4. ubuntu sudoers改坏了。

    pkexec bash 通过如上命令,可以进入root模式,然后恢复sudoers.前提是root账户没被禁用. precise (1) pkexec.1.gz Provided by: policy ...

  5. 64_o2

    openrdf-sesame-queryrender-2.8.10-2.fc26.noarch..> 11-Feb-2017 18:38 52014 openrdf-sesame-queryre ...

  6. Tutorial 5: Relationships & Hyperlinked APIs

    转载自:http://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/ Tutorial 5: ...

  7. PHP取整函数ceil,floor,round,intval的区别

    ceil — 进一法取整 float ceil ( float $value ) 返回不小于 value 的下一个整数,value 如果有小数部分则进一位.ceil() 返回的类型仍然是 float, ...

  8. Jmeter组件和属性(二)

    Jmeter脚本开发原则 简单.正确.高效.简单:去除无关的组件,同时能复用的尽量复用.正确:对脚本或者业务正确性进行必要的判断,不能少也不能多.(200),业务错误的情况下,也可能返回200,必须用 ...

  9. Sublime Text 2.0.2,Build 2221注册码

    Help ->Enter License,输入如下序列号: ----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-855 ...

  10. 认识hasLayout——IE浏览器css bug的一大罪恶根源 (转)

    认识hasLayout--IE浏览器css bug的一大罪恶根源 转 什么是hasLayout?hasLayout是IE特有的一个属性.很多的ie下的css bug都与其息息相关.在ie中,一个元素要 ...