题目链接

题意:给两个长度不超过1e5的字符串,问两个字符串的连续公共子串最大长度为多少?

思路:两个字符串连接之后直接后缀数组+LCP,在height中找出max同时满足一左一右即可;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
using namespace std;
typedef long long ll;
const int MAXN = ;
char s[MAXN],str[MAXN];
int sa[MAXN],t[MAXN],t2[MAXN],c[MAXN],n;
void build_sa(int m,int n) // m为字符ASCII码的最大值+1;n = strlen(s) + 1;
{
int i,*x = t, *y = t2;
for(i = ;i < m; i++) c[i] = ;
for(i = ;i < n; i++) c[x[i] = s[i]]++;
for(i = ;i < m; i++) c[i] += c[i-];
for(i = n - ;i >= ; i--) sa[--c[x[i]]] = i;
for(int k = ;k <= n;k <<= ){
int p = ;
for(i = n - k;i < n;i++) y[p++] = i;
for(i = ;i < n;i++) if(sa[i] >= k) y[p++] = sa[i] - k; for(i = ;i < m;i++) c[i] = ;
for(i = ;i < n;i++) c[x[y[i]]]++;
for(i = ;i < m;i++) c[i] += c[i-];
for(i = n - ;i >= ;i--) sa[--c[x[y[i]]]] = y[i]; swap(x,y);
x[sa[]] = ;// 将字符彻底转变为序号;
for(i = ,p = ;i < n;i++)
x[sa[i]] = y[sa[i]] == y[sa[i-]] && y[sa[i]+k] == y[sa[i-]+k]?p-:p++;
if(p >= n) break;
m = p;
}
}
int rk[MAXN],height[MAXN];
void getHeight()
{
int i,j,k = ;
for(i = ;i <= n;i++) rk[sa[i]] = i; // rk[i]:后缀i在sa[]中的下标
for(i = ;i < n;i++){
if(k) k--;
if(rk[i] == ) continue;
j = sa[rk[i] - ];
while(i+k<n && j+k<n && s[i+k] == s[j+k]) k++;
height[rk[i]] = k; // h[i] = height[rk[i]]; h[i] >= h[i-1] - 1;
}
}
int main()
{
while(scanf("%s%s",s,str) == ){
int len = strlen(s);
s[len] = '#';s[len+] = '\0';
strcat(s,str);
n = strlen(s);
s[n] = '#';
build_sa('z'+,n+);
getHeight();
int ans = -;
for(int i = ;i <= n;i++)
if(height[i] > ans && ((sa[i] < len && sa[i-] > len) || (sa[i] > len && sa[i-] < len)))
ans = height[i];
printf("%d\n",ans);
}
return ;
}

poj 2774 Long Long Message 后缀数组LCP理解的更多相关文章

  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 (后缀数组/后缀自动机模板题)

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

  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 ——后缀数组

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

  7. PKU 2774 Long Long Message (后缀数组练习模板题)

    题意:给你两个字符串.求最长公共字串的长度. by:罗穗骞模板 #include <iostream> #include <stdio.h> #include <stri ...

  8. [POJ 2774] Long Long Message 【后缀数组】

    题目链接:POJ - 2774 题目分析 题目要求求出两个字符串的最长公共子串,使用后缀数组求解会十分容易. 将两个字符串用特殊字符隔开再连接到一起,求出后缀数组. 可以看出,最长公共子串就是两个字符 ...

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

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

随机推荐

  1. [课程相关]homework-03

    零.准备工作 这次的作业是结对编程,因为一些原因我们的队伍一共有三个人,成员为:梁杰.夏天晗.谢祖三.由于大家不在一个班,交流起来也不是特别方便,所以我们经过讨论决定三个人约一个时间在一起完成这次作业 ...

  2. 关于在Eclipse中构建patch开发环境

    git仓库中不能添加空文件夹. 至于为什么git 仓库中不能添加空文件夹,我没有找到具体的原因. 在V2EX上有人说: 我猜是因为git的内部实现,即只对文件做快照决定的吧,另一方面空文件夹确实对源代 ...

  3. (转载)Java NIO:NIO概述(一)

    Java NIO:NIO概述 在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题.NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题.本文下面分别从Java ...

  4. hdu 2412 树形DP

    思路:对于最大的人数很容易想到,就直接dp.但对于最大值是否唯一就需要应用辅助数组,isOnly[i][0]表示dp[i][0]是否唯一,同理isOnly[i][1]. 那么当(dp[v][0]> ...

  5. hdu 4635 强连通度缩点

    思路:想用Tarjan算法进行缩点,并记录每个连通分支的点数.缩点完毕过后,找出所有出度或入度为0的连通分量,假设该连通分量的点数为num[i],那么 ans=Max(ans,(n-num-1)*(n ...

  6. C# 条形码识别

    目录: 一.识别库 二.从一张图片中提取多个条形码 三.注意事项 从博客园学了很多,本着分享的目的,希望后来者遇到类似问题时,不必重复造轮子,早点下班回家^-^. 一.识别库 目前主流的识别库主要有Z ...

  7. (转)MSMQ(消息队列)

    原文作者:虔诚者    点此传送至原文   前段时间研究WCF接触到了MSMQ,所以认真的学习了一下,下面是我的笔记. 我理解的MSMQ MSMQ可以被看成一个数据储存装置,就如同数据库,只不过数据存 ...

  8. JS中的原型继承和多重继承

    概念:1原型继承是创建新类型对象----子类型,子类型基于父类型,子类型拥有父类型所有的属性和方法(从父类型继承得到),然后修改其中的部分内容或者添加新的内容.继承最好在子类型模型可以被视为父类型对象 ...

  9. MyBatis(3.2.3) - Configuring MyBatis using XML, Settings

    The default MyBatis global settings, which can be overridden to better suit application-specific nee ...

  10. sqlsever 关于索引

    索引: 在sqlserver中,存储的单位最小是页,页是不可再分的B树:初衷是减少对磁盘的扫描次数,如果一个表或者索引没有使用B树(对于没有聚集索引的表是使用 Heap 堆进行存储的),那么查找一个数 ...