后缀数组的使用心得——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 ...
随机推荐
- 《C#高效编程》读书笔记09-避免在API中使用转换操作符
转换操作符为类之间引入了一种"可替换性"(substitutability)."可替换性"表示一个类的实例可以替换为另一个类的实例. public class ...
- Device
#import "AppDelegate.h" #import "RootViewController.h" @implementation AppDelega ...
- IO字节流。
字节输出流: java.io.OutputStream :抽象类,是表示输出字节流的所有类的父类. java.io.FileOutputStream extends OutputStream: 文件字 ...
- Sublime常用插件安装大全
作为前端人员,要找一个很顺手的编辑器真的不容易,我向大家推荐的一款实用前端开发神器,不但占地小,且插件很多,很强大. 下面我向大家介绍一下它的安装及插件的使用方法. 一.安装及安装emmet插件 首先 ...
- Tomcat中配置JAVA_HOME
一般来说我们在使用Tomcat时配置JAVA_HOME都是采用的系统环境变量直接配置,下面我提供一种新的配置思路. 这里我们使用的是免安装版的apache-tomcat-7.0.35,首先我们安装好j ...
- String.format()的用法
string.format()用法 2011-06-21 14:58:57| 分类: 工作笔记 | 标签:string format用法 |字号大中小 订阅 1.格式化货币(跟系统的环境有关 ...
- newCoder在线编程---(1)
二维数组查找 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 1.暴 ...
- 常用工具使用(sublimeText)
1.sublime Text (插件的安装,删除,更新) 1.1 使用 ctrl+`快捷键(Esc下面的波浪线按钮) 或者 菜单项View > Show Console 来调出命令界面,下面代 ...
- GetIPAddress——获得本地IP地址信息
1.gethostname()需要初始化套接字库 加载#pragma comment(lib,"ws2_32.lib"),和WSAStartup(MAKEWORD(2,2),&am ...
- python内存泄露的诊断(转)
本篇文章非原创,转载自:http://rstevens.iteye.com/blog/828565 . 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了 ...