poj 2774 Long Long Message 后缀数组LCP理解
题意:给两个长度不超过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理解的更多相关文章
- POJ 2774 Long Long Message 后缀数组
Long Long Message Description The little cat is majoring in physics in the capital of Byterland. A ...
- poj 2774 Long Long Message 后缀数组基础题
Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 24756 Accepted: 10130 Case Time Limi ...
- POJ - 2774 Long Long Message (后缀数组/后缀自动机模板题)
后缀数组: #include<cstdio> #include<algorithm> #include<cstring> #include<vector> ...
- POJ 2774 Long Long Message 后缀数组模板题
题意 给定字符串A.B,求其最长公共子串 后缀数组模板题,求出height数组,判断sa[i]与sa[i-1]是否分属字符串A.B,统计答案即可. #include <cstdio> #i ...
- POJ 2774 Long Long Message (后缀数组+二分)
题目大意:求两个字符串的最长公共子串长度 把两个串接在一起,中间放一个#,然后求出height 接下来还是老套路,二分出一个答案ans,然后去验证,如果有连续几个位置的h[i]>=ans,且存在 ...
- POJ 2774 Long Long Message ——后缀数组
[题目分析] 用height数组RMQ的性质去求最长的公共子串. 要求sa[i]和sa[i-1]必须在两个串中,然后取height的MAX. 利用中间的字符来连接两个字符串的思想很巧妙,记得最后还需要 ...
- PKU 2774 Long Long Message (后缀数组练习模板题)
题意:给你两个字符串.求最长公共字串的长度. by:罗穗骞模板 #include <iostream> #include <stdio.h> #include <stri ...
- [POJ 2774] Long Long Message 【后缀数组】
题目链接:POJ - 2774 题目分析 题目要求求出两个字符串的最长公共子串,使用后缀数组求解会十分容易. 将两个字符串用特殊字符隔开再连接到一起,求出后缀数组. 可以看出,最长公共子串就是两个字符 ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
随机推荐
- [课程相关]homework-05
零.准备工作 队伍成员:梁杰,夏天晗,谢祖三. 周五晚上吃完饭,我们就开始了讨论. 这次的要求是写服务器,客户端以及游戏结果动态显示.很明显是三个部分,我们也就顺其自然, 一人一个部分.我负责服务器, ...
- oracle中序列的使用
转载:http://blog.csdn.net/java958199586/article/details/7360152 序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l 自动提 ...
- LeetCode 338
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the ...
- poj 2724 二分图最大匹配
题意: 会给出M个串,我们要做的就是将这M个串给清除了.对于任意两个串,若二进制形式只有一位不一样,那么这两个串可以在一次操作消除,否则每个操作只能消除一个串. 3 3 *01 100 011 可以代 ...
- Junit,hamcrest和Eclemma安装及使用
Junit和hamcrest下载及安装 下载地址 Junit http://download.csdn.net/detail/luzle/6915487 Hamcrest http://d ...
- css3 多列布局记
css3 多列布局 多列布局属性: columns:column-widht和column-count的缩写. column-width:定义每列列宽度. column-count:定义分列列数. c ...
- ZooKeeper(3.4.5) - 原生 API 的简单示例
一.创建会话 1. 创建一个基本的ZooKeeper会话实例 package com.huey.dream.demo; import java.util.concurrent.CountDownLat ...
- 【转载】Apache Kafka:下一代分布式消息系统
http://www.infoq.com/cn/articles/kafka-analysis-part-1 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩 ...
- Ajax概述
- Excel数据生成Sql语句的方法
选中想要生成的列,套用表格格式,选中表包含标题的选项确定,然后在最右边的一列第二行处,点击函数功能,选择CONCATENATE,在文本里输入想要的结构即可 代码如下 复制代码 ,=CONCATENA ...