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) 后缀数组概念...还算是简单的,过程 ...
随机推荐
- 线程句柄和线程ID的区别
●CreateThread() API 用于创建线程. API 返回同时线程句柄,并通过参数得到线程标识符 (ID). 线程句柄有完全访问权创建线程对象. 运行线程时线程 ID 唯一标识线程在系统级别 ...
- qq上传文件进行测试要点分析
功能 QQ 兼容性 1.Win系统/Mac系统 Android/IOS 品牌 传 1.上传方式:直接拖拽,按回车键上传 2.多个文件同时上传给一人/多人(考虑稳定性,是否存在内存泄露) 3.不是好友 ...
- 技巧之如何快速使用websocket来监控标准输出
为啥是Websocket 服务端可以主动推送消息到浏览器端.比如服务端实时在打印日志,这是一个标准输出,可以实时将日志推送到浏览器. 为啥用websocketd (https://github.com ...
- malloc原理和内存碎片【转】
转自:http://www.cnblogs.com/zhaoyl/p/3820852.html 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查 ...
- Ubuntu 14.04 开机手动开启numlock led
在windows开机后,数字键盘灯是亮着的,但是当切换到ubuntu系统后登录用户名和密码时,如果你设定的有数字,都要先打开数字键盘区NUMLOCK键,然后再输入了,很不方便. 首先,需要安装一个小软 ...
- C#开发微信公众平台开发-微信海报介绍和开发流程
“让客户发展客户”,微信海报才是微信公众平台最高明的吸粉手段,海报上有粉丝的专属二维码,有粉丝的头像及商户宣传的广告等.新粉丝扫描这个专属二维码会关注公众号,同时分享海报的粉丝会增加积分换取礼品或者优 ...
- mac 卸载 node并重新安装
系统升级到 Sierra 之后,npm 经常出问题,最终把 node 卸载了,安装了新版本.mac 卸载 node 比较麻烦,stackoverflow 上面找到一个方法还不错,特地记录下来,代码如下 ...
- 7.Python3标准库--文件系统
''' Python的标准库中包含大量工具,可以处理文件系统中的文件,构造和解析文件名,还可以检查文件内容. 处理文件的第一步是要确定处理的文件的名字.Python将文件名表示为简单的字符串,另外还提 ...
- 使用Jackson来实现Java对象与JSON的相互转换的教程
一.入门Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换.1.JAVA对象转JSON[JSON序列化] 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- POJ 3616 Milking Time(最大递增子序列变形)
题目链接:http://poj.org/problem?id=3616 题目大意:给你时间N,还有M个区间每个区间a[i]都有开始时间.结束时间.生产效率(时间都不超过N),只能在给出的时间段内生产, ...