[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 描述 小猫在拜特兰的首府物理专业.最近有一个不幸的消 ...
 
随机推荐
- Javascript  Sting(字符串)对象
			
一, 如何计算字符串的长度? 可以通过.length属性来计算 <script type="text/javascript"> var txt="Hello ...
 - SynchronousQueue 的联想
			
SynchronousQueue介绍 SynchronousQueue是一种阻塞队列,该队列没有任务的容量.内部实现采用了一种性能更好的无锁算法. 代码实现里的Dual Queue,其中每一个put对 ...
 - [bzoj4551][Tjoi2016&Heoi2016]树-树链剖分
			
Brief Description 给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.) ...
 - MySQL数据库基础(四)(子查询与链接)
			
1.子查询简介 其中,所谓的"外层查询"并不是指"查找",指的是所有SQL语句的统称:结构化查询语言(Structured Query Language),简称 ...
 - idea 使用debugger技巧
			
1,背景 每个开发人员每天都离不开debugger,只要你在编码,就需要调试,作为一个开发快10年的老程序员每天都要写很多代码,当每个人接到任务的时候都会想,这些功能其实很快就能写完,没错,对于写代码 ...
 - c++ 如何获取多线程的返回值?
			
// Console.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> #include ...
 - opencv 离线文档下载地址在哪里?
			
OpenCV 官方离线文档下载地址:http://docs.opencv.org/ 如何生成离线文档? http://docs.opencv.org/master/d4/db1/tutorial_do ...
 - uva 1151最小生成树
			
先求一次最小生成树,可以排除n*(n*1)/2-(n-1)条边,每次利用二进制法枚举套餐的选择,套餐中的点直接处理,如果两个套餐有公共点直接合并,他们一定连通,然后枚举第一步最小生成树得到的n-1条边 ...
 - 关键字final的用法
			
final关键字可以用来修饰类.方法和变量. 1.final修饰的类不能被继承. 2.final修饰的方法不能被重写. 3.final修饰的变量是常量,不能修改其值.
 - BZOJ 2429: [HAOI2006]聪明的猴子
			
Description 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地 表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较 ...