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) 后缀数组概念...还算是简单的,过程 ...
随机推荐
- vue登录/查看/结束端口号
下班时间到啦! --下班都是他们的,而我,还是什么都没有. vue登录(未登录情况下不允许进入) 在路由里加上登录的权限 meta: { requireAuth: true, title: 'Logi ...
- 设计模式之Composite
设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) Composite定义? 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构. 想到Compo ...
- VueJS 获取并编译远程模板 解决方案(简单版)
原文链接:https://savokiss.com/tech/vuejs-remote-template.html see: forum
- 【IDEA】IDEA中maven项目pom.xml依赖不生效解决
问题: 今天在web项目中需要引入poi相关jar包.查看之下才发现pom.xml中的依赖虽然已经下载到了本地仓库 repository,但是却没有加入到项目路径的 Extenal Libraries ...
- webgote的例子(3)Sql注入(SearchPOST)
Sql注入(Search/POST) (本章内容):post的方式进行注入 今天来讲一下sql注入的另一个例子(post) 上一个用的是get请求的方法将我们的参数传到服务器进行执行 上图中的标红是需 ...
- 在Linux(CentOS)中安装.netcore SDK
官方链接 :https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-current 可以直接根据官方链接,选择Li ...
- 【转载】C#异常Retry通用类
//Retry机制 public static class Retry { /// <summary> /// 重试零个参数无返回值的方法 /// </summary> /// ...
- caffe Python API 之SoftmaxWithLoss
net.loss = caffe.layers.SoftmaxWithLoss(net.fc3, net.label) 输出: layer { name: "loss" type: ...
- log4j生成日志
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可 ...
- apache、nginx、php、mysql 编译参数查询
nginx编译参数查看:/usr/local/nginx/sbin/nginx -V apache编译参数查看:cat /usr/local/apache2/build/config.nice mys ...