后缀数组的使用心得——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 ...
随机推荐
- ASP.NET Web.Config连接数据库(测试)
事先说明,我是看着http://jingyan.baidu.com/article/ff411625bc461712e5823775.html做的. web.Config代码(vs2010): 使用的 ...
- Java开发笔记(九十八)利用Callable启动线程
前面介绍了如何利用Runnable接口构建线程任务,该方式确实方便了线程代码的复用与共享,然而Runnable不像公共方法那样有返回值,也就无法将线程代码的处理结果传给外部,造成外部既不知晓该线程是否 ...
- OpenStack Ocata Telemetry 警告服务部署
下列操作在控制节点上进行: 1 准备条件 在配置OpenStack Telemetry服务之前,你必须创建数据库.服务凭证和API端点. 1.1 数据库 以root用户连接数据库服务器,创建glanc ...
- 从零开始的全栈工程师——js篇2.14(表单与计时器)
一.表单 Form input select textarea type=”radio/checkbox/password/button/text/submit/reset/” 表单的事件 oncha ...
- 海海DRM视频保护解密流程分析
环境及工具 手机 :小米手机 MI 2A 系统版本: Android 4.1.1 工具 : IDA pro 6.6 .C32Asm .VS2005 一:第一次打开加密视频会出现如下验证: ...
- mif文件生成方法
mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.常见生成方法: Quartus自带的mif编辑器生成 mif软件生成 高级编程语 ...
- pycharm tab换为4个空格
Edit => find => replace 然后勾上 Regex,上一行输入 \t,下一行输入4个空格.
- 响应式网站布局要适应的当下主流手机屏幕的各个版本的分辨率有哪些(media query)
CSS宽有14种: 320.360.375.384.400.414.533.600.768.800.853.1024.1280.1366 CSS高有16种: 360.480.533.568.569.6 ...
- 干净的架构The Clean Architecture_软件架构系列
本文转载自:https://www.jdon.com/artichect/the-clean-architecture.html ,这个博客站很有历史了,博主经常翻译Github大牛的文章,值得墙裂推 ...
- Windows服务调试
Windows 服务(附服务开发辅助工具) 转: http://www.cnblogs.com/BoyXiao/archive/2011/08/07/2130208.html 近来在 Windows ...