POJ 2774 Long Long Message 后缀数组模板题
题意
给定字符串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 后缀数组模板题的更多相关文章
- 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 后缀数组
Long Long Message Description The little cat is majoring in physics in the capital of Byterland. A ...
- poj 2774 Long Long Message 后缀数组LCP理解
题目链接 题意:给两个长度不超过1e5的字符串,问两个字符串的连续公共子串最大长度为多少? 思路:两个字符串连接之后直接后缀数组+LCP,在height中找出max同时满足一左一右即可: #inclu ...
- POJ 2774 Long Long Message (后缀数组+二分)
题目大意:求两个字符串的最长公共子串长度 把两个串接在一起,中间放一个#,然后求出height 接下来还是老套路,二分出一个答案ans,然后去验证,如果有连续几个位置的h[i]>=ans,且存在 ...
- POJ 2774 Long Long Message ——后缀数组
[题目分析] 用height数组RMQ的性质去求最长的公共子串. 要求sa[i]和sa[i-1]必须在两个串中,然后取height的MAX. 利用中间的字符来连接两个字符串的思想很巧妙,记得最后还需要 ...
- BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题
BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include &l ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
- POJ2774 & 后缀数组模板题
题意: 求两个字符串的LCP SOL: 模板题.连一起搞一搞就好了...主要是记录一下做(sha)题(bi)过程心(cao)得(dan)体(xin)会(qing) 后缀数组概念...还算是简单的,过程 ...
随机推荐
- LOW逼三人组(三)----插入排序
插入排序思路 插入排序算法: import random # 随机模块 import time def cal_time(func): # 装饰器 ,用来检测算法所执行的时间 def wrapper( ...
- MSSQL ADO.NET
为什么要学ADO.NET 之前我们所学的只能在查询分析器里查看数据,操作数据,我们让普通用户去学sql,所以我们搭建了一个界面(Web/Winform) 让用户方面的操作数据库中的数据 什么是ADO. ...
- Struts访问servletAPI方式
1.原理
- http状态码说明
在学习网页设计的时候都应该知道状态码,但我们常见的状态码都是200,404,下面介绍其他的状态值 1开头的http状态码表示临时响应并需要请求者继续执行操作的状态代码. 100 (继续) 请求者应 ...
- Linux 上配置 NTP SERVER
在CENTOS 6.2上面安装配置NTP SERVER 安装NTP:yum install ntp 配置时间源vi /etc/ntp.confserver 210.72.145.44server nt ...
- MySQL Table Information
show tables; --显示该数据库里的所有表show columns from 表名; --显示表字段use information_sc ...
- JNDI(Java Naming and Directory Interface,Java命名和目录接口)
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访 ...
- golang之结构体和方法
结构体的定义 结构体是将零个或者多个任意类型的命令变量组合在一起的聚合数据类型.每个变量都叫做结构体的成员. 其实简单理解,Go语言的结构体struct和其他语言的类class有相等的地位,但是GO语 ...
- 三十分钟理解博弈论“纳什均衡” -- Nash Equilibrium
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 纳什均衡(或者纳什平衡),Nash ...
- cfg 4 ocl
http://blog.sina.com.cn/s/blog_6c868c470102v15y.html rnnlib真难装 http://sourceforge.net/p/rnnl/wiki/Ho ...