后缀数组的使用心得——POJ2774 最长连续公共子串
对于这道题,将两个字符串直接合并成为一个字符串,分别记录连个字符串结束的位置。
首先,应用黑暗圣典的模板,我们可以顺利得到height,rank,sa三个数组。
之后直接扫描1-n所有的位置,选出来一个,符合“两者都在不同子串的最大长度即可”。
此时我们会发现,sa数组记录了每个子串开头的位置,可以用于判断。
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std; const long long MAXN=;
const long long INF=1e8+;
char s[MAXN];
int sa[MAXN],t[MAXN],t2[MAXN],c[MAXN],n;
int rankk[MAXN],height[MAXN];
void getHeight()
{
int k=;
for(int i=;i<n;++i)rankk[sa[i]]=i;
for(int i=;i<n;++i)
{
if(k)k--;
int j=sa[rankk[i]-];
while(s[i+k]==s[j+k])k++;
height[rankk[i]]=k;
}
} void build_sa(int m)
{
int i,*x=t,*y=t2; for(int i=;i<m;++i)c[i]=;
for(int i=;i<n;++i)c[x[i]=s[i]]++;
for(int i=;i<m;++i)c[i]+=c[i-];
for(int i=n-;i>=;--i)sa[--c[x[i]]]=i;
for(int k=;k<=n;k*=)
{
int p=;
for(int i=n-k;i<n;++i)y[p++]=i;
for(int i=;i<n;++i)if(sa[i]>=k)y[p++]=sa[i]-k; for(int i=;i<m;++i)c[i]=;
for(int i=;i<n;++i)c[x[y[i]]]++;
for(int i=;i<m;++i)c[i]+=c[i-];
for(int i=n-;i>=;i--)sa[--c[x[y[i]]]]=y[i];
swap(x,y);
p=;x[sa[]]=;
for(int i=;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 main()
{
// cin.sync_with_stdio(false);
scanf("%s",s);
int len=strlen(s);
scanf("%s",s+len);
int len2=strlen(s);
n=len2+;
build_sa();
getHeight();
int maxx=-;
for(int i=;i<n;++i)
{
// cout<<height[i]<<ends<<s+sa[i]<<endl;
if((sa[i]>=len&&sa[i-]<len)||(sa[i]<len&&sa[i-]>=len))maxx=max(maxx,height[i]);
}
cout<<maxx<<"\n";
// cout<<s<<endl;
// cout<<len<<ends<<len2<<endl;
//
return ;
}
后缀数组的使用心得——POJ2774 最长连续公共子串的更多相关文章
- POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次
Milk Patterns Description Farmer John has noticed that the quality of milk given by his cows varie ...
- poj3080Blue Jeans(在m个串中找到这m个串的 最长连续公共子序列)
Description The Genographic Project is a research partnership between IBM and The National Geographi ...
- 最长连续公共子序列(LCS)与最长递增公共子序列(LIS)
最长公共子序列(不连续) 实际问题中也有比较多的应用,比如,论文查重这种,就是很实际的一个使用方面. 这个应该是最常见的一种了,不再赘述,直接按照转移方程来进行: 按最普通的方式就是,直接构造二维矩阵 ...
- poj2774 后缀数组2个字符串的最长公共子串
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 26601 Accepted: 10 ...
- poj 3261 Milk Patterns(后缀数组)(k次的最长重复子串)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7938 Accepted: 3598 Cas ...
- POJ1226 Substrings ——后缀数组 or 暴力+strstr()函数 最长公共子串
题目链接:https://vjudge.net/problem/POJ-1226 Substrings Time Limit: 1000MS Memory Limit: 10000K Total ...
- poj 2774 后缀数组 两个字符串的最长公共子串
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 31904 Accepted: 12 ...
- 后缀数组 模板题 hdu1403(最长公共(连续)子串)
好气啊,今天没有看懂后缀树和后缀自动机 只能写个后缀数组发泄一下了orz #include <cstdio> #include <cstring> *; int wa[N], ...
- luogu 2463 [SDOI2008]Sandy的卡片 kmp || 后缀数组 n个串的最长公共子串
题目链接 Description 给出\(n\)个序列.找出这\(n\)个序列的最长相同子串. 在这里,相同定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串. 思路 参考:hzwe ...
随机推荐
- Freetype 安装时提示 make: Nothing to be done for `unix'
[Software-Freetype] Freetype 安装时提示 make: Nothing to be done for `unix' 官网下载的第三方软件包,编译安装会报以下错误,解决办法如下 ...
- babel7中 preset-env 完全使用
babel7中 preset-env 完全使用 const presets = [ ['@babel/env', { // chrome, opera, edge, firefox, safari, ...
- 关于WebStorm,PhpStorm新版本输入中文问题
此文意在记录webstorm,PhpStorm输入中文无提示的问题,对于百忙中的开发无需浏览下面那一段套路话,直接浏览原文链接或者本博客绿色文字解决问题即可. 对于使用过dw,sublime,brac ...
- vue $set用法
需求,想给下面的数据添加一个hoby属性 {{data.hoby}}-->让这里的视图改变 data:{ name: "简书", age: '3', info: { cont ...
- Error: unknown argument: '-websockets'
参考原文:http://www.cocoachina.com/bbs/read.php?tid=194014 解决方法:点击项目右边编辑区域上面有一个building setting找到other l ...
- Linux文件的三个时间属性(Atime,Mtime,Ctime)
Linux下,一个文件有三种时间,分别是: 访问时间:atime 修改时间:mtime 状态时间:ctime 访问时间:对文件进行一次读操作,它的访问时间就会改变.例如像:cat.more等操作,但是 ...
- 一篇文章读懂JSON
什么是json? W3C JSON定义修改版: JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式,并不是 ...
- 查看mysql历史命令
默认情况下操作mysql会在家目录下创建一个隐藏的mysql历史命令文件.mysql_history 在管理授权mysql账户时也会记录这些明文密码到这个文件,非常的不安全 [root@localho ...
- HDU2433 最短路 + 剪枝优化
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2433 ,最短路(SPFA或优化过的Dijstra) + 剪枝优化 这道题关键还是在几个剪枝上面,没有剪 ...
- Trie:字典树
简介 \(Trie\),又称字典树或前缀树,是一种有序树状的数据结构,用于保存关联数组,其中的键值通常是字符串. 作用 把许多字符串做成一个字符串集合,并可以对其进行快速查找(本文以求多少个单词是一个 ...