长长的消息
时间限制: 4000MS   内存限制: 131072K
提交总数: 32393   接受: 13079
案件时间限制: 1000MS

描述

小猫在拜特兰的首府物理专业。最近有一个不幸的消息传来,他的母亲生病了。担心在火车票上花费太多(拜特兰是一个如此大的国家,他不得不在火车上花费16个小时到家乡),他决定只和母亲发短信。 



小猫生活在一个非常富有的家庭,所以他经常到移动服务中心去查看他在短信上花了多少钱。昨天,服务中心的电脑坏了,打印了两条很长的信息。很快就发现了这只聪明的小猫: 



1.所有消息中的字符都是小写的拉丁字母,没有标点符号和空格。 

2.所有短信都被相互追加 - (i + 1)短信直接在第i个短信之后 - 这就是为什么这两个短信很长。 

3.他自己的短信已经被附加在一起,但是由于破损的计算机,可能有很多冗余字符向左和向右出现。 

例如:如果他的短信是“motheriloveyou”,那么由该机器打印的长信息可能是“hahamotheriloveyou”,“motheriloveyoureally”,“motheriloveyouornot”,“bbbmotheriloveyouaaa”等之一 

。4.对于这些破碎的问题,猫已经两次打印他的原始文本(所以出现两个很长的消息)。即使两个打印的消息中的原始文本保持不变,两边的冗余字符也可能不同。 



给你这两条很长的信息,你必须输出由小猫写的最长可能的原始文本的长度。 



背景: 

Byterland移动服务中的短信以每字节为单位收费。这就是为什么这只小猫正在担心最长的原始文本能持续多久。 



为什么要你写程序?有四个方面的问题: 

1,这些小猫在物理课上很忙碌; 

小猫想保留他对母亲所说的话。 

POJ是一个很棒的在线评委。 

来自“现代汉英综合大词典”小猫想从POJ那里挣点钱,并试图说服他的母亲去看医生: 

输入

在两个输入行上分别输入两个小写字母的字符串。每个字符的数量不会超过100000。

产量

单个整数的单行 - 小猫写的原始文本的最大长度是多少?

示例输入

yeshowmuchiloveyoumydearmotherreallyicannotbelieveit
yeaphowmuchiloveyoumydearmother

示例输出

27

经典的双串匹配最长公共长度问题

我们在第一个串末尾末尾加一个'#'这样的东西,在把第二个串连上去,这样子#一定不会参与匹配而且我们还把两个串分隔开了

接下来就是求lcp了,我们只需找到跨越#的最大的height就可以了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = head[u]; k != -1; k = edge[k].next)
using namespace std;
const int maxn = 200005,maxm = 100005,INF = 1000000000;
inline int RD(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
return out * flag;
}
char s[maxn],B[maxn];
int la,lb,n,m = 256,sa[maxn],rank[maxn],height[maxn],t1[maxn],t2[maxn],c[maxn];
void SA(){
int *x = t1,*y = t2;
for (int i = 0; i <= m; i++) c[i] = 0;
for (int i = 1; i <= n; i++) c[x[i] = s[i]]++;
for (int i = 1; i <= m; i++) c[i] += c[i - 1];
for (int i = n; i >= 1; i--) sa[c[x[i]]--] = i;
for (int k = 1; k <= n; k <<= 1){
int p = 0;
for (int i = n - k + 1; i <= n; i++) y[++p] = i;
for (int i = 1; i <= n; i++) if (sa[i] - k > 0) y[++p] = sa[i] - k;
for (int i = 0; i <= m; i++) c[i] = 0;
for (int i = 1; i <= n; i++) c[x[y[i]]]++;
for (int i = 1; i <= m; i++) c[i] += c[i - 1];
for (int i = n; i >= 1; i--) sa[c[x[y[i]]]--] = y[i];
swap(x,y);
p = 1; x[sa[1]] = 1;
for (int i = 2; i <= n; i++)
x[sa[i]] = (y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k]) ? p : ++p;
if (p >= n) break;
m = p;
}
for (int i = 1; i <= n; i++) rank[sa[i]] = i;
int k = 0;
for (int i = 1; i <= n; i++){
if (k) k--;
int j = sa[rank[i] - 1];
while (s[i + k] == s[j + k]) k++;
height[rank[i]] = k;
}
}
void solve(){
int ans = 0;
for (int i = 2; i <= n; i++){
if (sa[i] <= la && sa[i - 1] > la || sa[i] > la && sa[i - 1] <= la){
ans = max(ans,height[i]);
}
}
cout<<ans<<endl;
}
int main(){
scanf("%s",s + 1); la = strlen(s + 1);
scanf("%s",B + 1); lb = strlen(B + 1);
strcat(s + 1,"#"); strcat(s + 1,B + 1);
n = strlen(s + 1);
SA();
solve();
return 0;
}

POJ2774 Long Long Message 【后缀数组lcp】的更多相关文章

  1. poj 2774 Long Long Message 后缀数组LCP理解

    题目链接 题意:给两个长度不超过1e5的字符串,问两个字符串的连续公共子串最大长度为多少? 思路:两个字符串连接之后直接后缀数组+LCP,在height中找出max同时满足一左一右即可: #inclu ...

  2. POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串

    题目链接:https://vjudge.net/problem/POJ-2774 Long Long Message Time Limit: 4000MS   Memory Limit: 131072 ...

  3. poj2774 Long Long Message 后缀数组求最长公共子串

    题目链接:http://poj.org/problem?id=2774 这是一道很好的后缀数组的入门题目 题意:给你两个字符串,然后求这两个的字符串的最长连续的公共子串 一般用后缀数组解决的两个字符串 ...

  4. poj2774 Long Long Message(后缀数组or后缀自动机)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Long Long Message Time Limit: 4000MS   Me ...

  5. POJ2774 Long Long Message [后缀数组]

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 29277   Accepted: 11 ...

  6. (HDU 5558) 2015ACM/ICPC亚洲区合肥站---Alice's Classified Message(后缀数组)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5558 Problem Description Alice wants to send a classi ...

  7. POJ 2774 Long Long Message 后缀数组

    Long Long Message   Description The little cat is majoring in physics in the capital of Byterland. A ...

  8. poj 2774 Long Long Message 后缀数组基础题

    Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 24756   Accepted: 10130 Case Time Limi ...

  9. hdu 3518 Boring counting 后缀数组LCP

    题目链接 题意:给定长度为n(n <= 1000)的只含小写字母的字符串,问字符串子串不重叠出现最少两次的不同子串个数; input: aaaa ababcabb aaaaaa # output ...

  10. POJ-2774-Long Long Message(后缀数组-最长公共子串)

    题意: 给定两个字符串 A 和 B,求最长公共子串. 分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀. 求 A 和 B 的最长公共子串等价于求 A 的后缀和 B 的后缀的最长公共前缀的最大 ...

随机推荐

  1. Django自带后台使用配置

    参考官网地址:https://docs.djangoproject.com/en/1.11/ref/contrib/admin/ ,本文章值是介绍简单配置,如果需要详细内容可以查阅官方文档 自动管理界 ...

  2. Leecode刷题之旅-C语言/python-69x的平方根

    /* * @lc app=leetcode.cn id=69 lang=c * * [69] x 的平方根 * * https://leetcode-cn.com/problems/sqrtx/des ...

  3. 算法竞赛入门经典-1.5.4 Q&A

    这小节考察实践能力,要求在不要查书.不要网上找答案,自己用实验的方法解决以下五个问题: 做这五道题时,好几道都没思路,违反了规则到网上找了一圈,居然没找到答案,于是打算写这篇博客.不知是否有更好的实践 ...

  4. go学习笔记-变量和常量

    变量和常量 变量 基本写法 //定义一个名称为"variableName",类型为"type"的变量 var variableName type //定义三个类 ...

  5. ABAP CDS ON HANA-(12)ODATA Service

    Create a CDS view and we have the view type as ‘BASIC’ view To publish this as oData, add the annota ...

  6. 使用 MySQL 存储 Hue 元数据

    1.在 MySQL 中增加数据库 hue 2.编辑 hue.ini 文件 [[database]] # Database engine is typically one of: # postgresq ...

  7. 对C语言连等式的学习

    例子如下 [pgsql@localhost soft]$ cat test1.c #include <stdlib.h> #include <stdio.h> int main ...

  8. 洛谷P3958 奶酪

    题目链接 这道题貌似可以用BFS来写吧qwq. 我用的是并查集,把联通的洞合并在同一个几何中,最后只需要判断是否存在上表面和下表面有相同集合的洞即可. 但是需要注意的是还有这样的一种情况:有一个大洞贯 ...

  9. mutation与vuex区别

    vuex- action   1.当点发送过快,页面中渲染的内容与state中的数据不一致,vuex里面的state变得慢,且不持续更新 2.action中是可以做到页面中state中数据保持一致 责 ...

  10. abtest-system后台系统设计与搭建

    本文来自网易云社区 作者:刘颂 1 项目背景: 2017年5月:客户端提出增加https&dns以及双cdn业务功能 后台配合实现使用disconf配置 针对不同的域名或者请求配置不同的htt ...