POJ 2774 Long Long Message 后缀数组模板题
2024-10-21 09:25:53
题意
给定字符串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 ;
}
最新文章
- Struts2第一个入门案例
- Delete,Update与LEFT Join
- crawler: 爬虫的基本结构
- 数据结构--树状数组&;&;线段树--基本操作
- Go语言开发环境搭建
- CentOS安装vsftpd
- sql查询结果集根据指定条件排序的方法
- GPUImage 自定义滤镜
- 关于padding
- ";手机信号放大器"; 让手机信号增强的办法
- 浏览器的云加速可能导致IP统计异常
- Linux学习之sudo命令
- js中valueOf方法的使用
- 正则表达式判断QQ号格式是否正确
- ionic3使用@angular/http 访问nodejs(koa2框架)服务不能返回数据
- Asp.Net MVC页面显示后台处理进度问题
- 【做题】arc072_f-Dam——维护下凸包
- 第 6 章 存储 - 039 - Data Volume 之 bind mount
- 百练-16年9月推免-B题-字符串判等
- 关于float样式
热门文章
- 原 jQuery中document的ready和load事件的区别?
- Friends and Berries URAL - 2067 (计算三点共线和计算的时候的注意点)
- 好消息! 不用再羡慕Python有jupyter 我R也有Notebook了【附演示视频】
- MongoDB之主从复制和副本集(四)
- 浅析linux内核中timer定时器的生成和sofirq软中断调用流程(转自http://blog.chinaunix.net/uid-20564848-id-73480.html)
- MessageDigest类实现md5加密
- 使用extjs做的一个简单grid
- JavaWeb知识回顾-servlet简介。
- WordPress SMTP发送邮件插件:WP SMTP
- appium---【Mac】Appium-Doctor提示WARN:“ ios_webkit_debug_proxy cannot be found”解决方案