[POJ2774]Long Long Message
一句话题意
给两个串,求最长公共子串。
sol
把两个串接在一起求后缀数组。其实中间最好用一个没有出现过的字符连接起来。
判断如果\(SA[i]\)和\(SA[i-1]\)不属于同一个串的话就可以拿\(Height[i]\)更新答案
code
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 2e5+5;
char s1[N],s2[N];
int n,n1,n2,a[N],t[N],x[N],y[N],SA[N],Rank[N],Height[N],ans;
bool cmp(int i,int j,int k){return y[i]==y[j]&&y[i+k]==y[j+k];}
void getSA()
{
int m=30;
for (int i=1;i<=n;++i) ++t[x[i]=a[i]];
for (int i=1;i<=m;++i) t[i]+=t[i-1];
for (int i=n;i>=1;--i) SA[t[x[i]]--]=i;
for (int k=1;k<=n;k<<=1)
{
int p=0;
for (int i=0;i<=m;++i) y[i]=0;
for (int i=n-k+1;i<=n;++i) y[++p]=i;
for (int i=1;i<=n;++i) if (SA[i]>k) y[++p]=SA[i]-k;
for (int i=0;i<=m;++i) t[i]=0;
for (int i=1;i<=n;++i) ++t[x[y[i]]];
for (int i=1;i<=m;++i) t[i]+=t[i-1];
for (int i=n;i>=1;--i) SA[t[x[y[i]]]--]=y[i];
swap(x,y);
x[SA[1]]=p=1;
for (int i=2;i<=n;++i) x[SA[i]]=cmp(SA[i],SA[i-1],k)?p:++p;
if (p>=n) break;
m=p;
}
for (int i=1;i<=n;++i) Rank[SA[i]]=i;
for (int i=1,j=0;i<=n;++i)
{
if (j) --j;
while (a[i+j]==a[SA[Rank[i]-1]+j]) ++j;
Height[Rank[i]]=j;
}
}
bool diff(int i,int j){return (i<=n1&&j>n1)||(i>n1&&j<=n1);}
int main()
{
scanf("%s",s1+1);n1=strlen(s1+1);
scanf("%s",s2+1);n2=strlen(s2+1);
n=n1+n2;
for (int i=1;i<=n1;++i) a[i]=s1[i]-96;
for (int i=1;i<=n2;++i) a[n1+i]=s2[i]-96;
getSA();
for (int i=1;i<=n;++i)
if (diff(SA[i],SA[i-1]))
ans=max(ans,Height[i]);
printf("%d\n",ans);
return 0;
}
[POJ2774]Long Long Message的更多相关文章
- POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串
题目链接:https://vjudge.net/problem/POJ-2774 Long Long Message Time Limit: 4000MS Memory Limit: 131072 ...
- POJ2774 Long Long Message 【SAM】
POJ2774 Long Long Message 找两个串的最长公共字串 对其中一个串\(s\)建\(SAM\),然后我们如何找到最长公共字串,办法就是枚举\(t\)串所有的前缀,然后找各个前缀的最 ...
- [POJ2774]Long Long Message 解题报告
Long Long Message Description The little cat is majoring in physics in the capital of Byterland. A p ...
- POJ2774 Long Long Message [后缀数组]
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 29277 Accepted: 11 ...
- poj2774 Long Long Message(后缀数组or后缀自动机)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Long Long Message Time Limit: 4000MS Me ...
- poj2774 Long Long Message(后缀数组)
[题目链接] http://poj.org/problem?id=2774 [题意] A & B的最长公共子序列. [思路] 拼接+height数组.将AB拼接成一个形如A$B的串,枚举hei ...
- poj2774 Long Long Message 后缀数组求最长公共子串
题目链接:http://poj.org/problem?id=2774 这是一道很好的后缀数组的入门题目 题意:给你两个字符串,然后求这两个的字符串的最长连续的公共子串 一般用后缀数组解决的两个字符串 ...
- 题解【poj2774 Long Long Message】
Description 求两个串的最长连续公共字串 Solution 后缀数组入门题吧 把两个串连在一起,中间加一个分隔符,然后跑一遍后缀数组,得到 height 和 sa 一个 height[i] ...
- POJ2774 Long Long Message 【后缀数组lcp】
长长的消息 时间限制: 4000MS 内存限制: 131072K 提交总数: 32393 接受: 13079 案件时间限制: 1000MS 描述 小猫在拜特兰的首府物理专业.最近有一个不幸的消 ...
随机推荐
- Windows Server 2016-重命名域控制器
当公司发展到一定规模或者信息化建设到一定程度的情况下,很多信息化规范出台:很多初期服务器搭建包括服务搭建等计算机名等都是按照默认或者随机命名的,不便于区分业务或服务等.通过前边的章节我们对Active ...
- appium如何切换Native和WebView
方法一: Set<String>contexts=driver.getContextHandles(); driver.context((String)contexts.toArray() ...
- linux使用tcpdump抓包工具抓取网络数据包,多示例演示
tcpdump是linux命令行下常用的的一个抓包工具,记录一下平时常用的方式,测试机器系统是ubuntu 12.04. tcpdump的命令格式 tcpdump的参数众多,通过man tcpdump ...
- ipset批量配置iptables
简介: ipset是iptables的扩展,允许你创建匹配整个地址sets(地址集合)的规则.而不像普通的iptables链是线性的存储和过滤,ip集合存储在带索引的数据结构中,这种集合比较大也可以进 ...
- CENTOS6.6下mysql5.7.11的percona-xtrabackup安装与备份
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn Xtrabackup有两个主要的工具:xtrabackup.inno ...
- Mysql内置的profiling性能分析工具
要想优化一条 Query,我们就需要清楚的知道这条 Query 的性能瓶颈到底在哪里,是消耗的 CPU计算太多,还是需要的的 IO 操作太多?要想能够清楚的了解这些信息,在 MySQL 5.0 和 M ...
- R语言-时间序列
时间序列:可以用来预测未来的参数, 1.生成时间序列对象 sales <- c(18, 33, 41, 7, 34, 35, 24, 25, 24, 21, 25, 20, 22, 31, 40 ...
- R实战 第三篇:数据处理
在实际分析数据之前,必须对数据进行清理和转化,使数据符合相应的格式,提高数据的质量.数据处理通常包括增加新的变量.处理缺失值.类型转换.数据排序.数据集的合并和获取子集等. 一,增加新的变量 通常需要 ...
- JVM笔记6-垃圾回收概述
JVM进行垃圾回收时要考虑哪的问题如下: 1.如何判定对象为垃圾对象? 1.引用计数法:在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值就+1,引用失效的时候,计数器的值就-1, ...
- Srtuts2实现登录界面(不连接数据库)
1.设计思路 (1)利用Struts2框架设计出一个登录页面的跳转,当用户名和密码都正确时, 跳到登录成功页面:否则,跳到登录失败页面,并在10秒钟内跳到登录界面: (2)在Action中判断用户名和 ...