Description

求两个串的最长连续公共字串

Solution

后缀数组入门题吧

把两个串连在一起,中间加一个分隔符,然后跑一遍后缀数组,得到 height 和 sa

一个 height[i] 对答案有贡献的充要条件是 sa[i] 和 sa[i-1] 分别在两个串中

Code

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 200200;
char s1[N], s2[N], S[N];
int n, tmpn, cnt[N], ans, sa[N], rk[N], height[N];
struct node { int id, x, y; } a[N], b[N];
int main() {
scanf("%s %s", s1, s2); tmpn = strlen(s1);
for(int i = 0; s1[i]; i++) S[++n] = s1[i]; S[++n] = '#';
for(int i = 0; s2[i]; i++) S[++n] = s2[i];
for(int i = 1; i <= n; i++) cnt[S[i]] = 1;
for(int i = 0; i <= 128; i++) cnt[i] += cnt[i - 1];
for(int i = 1; i <= n; i++) rk[i] = cnt[S[i]];
for(int L = 1; L <= n; L *= 2) {
for(int i = 1; i <= n; i++)
a[i].id = i, a[i].x = rk[i], a[i].y = rk[i + L];
for(int i = 1; i <= n; i++) cnt[i] = 0;
for(int i = 1; i <= n; i++) cnt[a[i].y]++;
for(int i = 1; i <= n; i++) cnt[i] += cnt[i - 1];
for(int i = 1; i <= n; i++) b[cnt[a[i].y]--] = a[i];
for(int i = 1; i <= n; i++) cnt[i] = 0;
for(int i = 1; i <= n; i++) cnt[a[i].x]++;
for(int i = 1; i <= n; i++) cnt[i] += cnt[i - 1];
for(int i = n; i >= 1; i--) a[cnt[b[i].x]--] = b[i];
for(int i = 1; i <= n; i++)
if(a[i].x == a[i - 1].x && a[i].y == a[i - 1].y)
rk[a[i].id] = rk[a[i - 1].id];
else rk[a[i].id] = rk[a[i - 1].id] + 1;
} for(int i = 1; i <= n; i++) sa[rk[i]] = i;
int k = 0;
for(int i = 1; i <= n; i++) {
int j = sa[rk[i] - 1]; if(k) k--;
while(i + k <= n && j + k <= n && S[i + k] == S[j + k]) k++;
height[rk[i]] = k;
} for(int i = 1; i <= n; i++)
if(sa[i] <= tmpn && sa[i - 1] > tmpn ||
sa[i] > tmpn && sa[i - 1] <= tmpn)
ans = max(ans, height[i]);
printf("%d\n", ans);
return 0;
}

题解【poj2774 Long Long Message】的更多相关文章

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

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

  2. POJ2774 Long Long Message 【SAM】

    POJ2774 Long Long Message 找两个串的最长公共字串 对其中一个串\(s\)建\(SAM\),然后我们如何找到最长公共字串,办法就是枚举\(t\)串所有的前缀,然后找各个前缀的最 ...

  3. [POJ2774]Long Long Message 解题报告

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

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

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

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

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

  6. 题解 CF950B 【Intercepted Message】

    题目链接 先吐槽一番:本宝宝好久没写过题解了...首先我们想一个贪心策咯.就是我们预处理出前缀和,然后一边扫过去,记录一个l1,l2和一个n1,n2.分别表示我们现在第一个数组切到l1,上一次切是在n ...

  7. poj2774 Long Long Message(后缀数组)

    [题目链接] http://poj.org/problem?id=2774 [题意] A & B的最长公共子序列. [思路] 拼接+height数组.将AB拼接成一个形如A$B的串,枚举hei ...

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

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

  9. [POJ2774]Long Long Message

    vjudge 一句话题意 给两个串,求最长公共子串. sol 把两个串接在一起求后缀数组.其实中间最好用一个没有出现过的字符连接起来. 判断如果\(SA[i]\)和\(SA[i-1]\)不属于同一个串 ...

随机推荐

  1. 【转】MMO即时战斗:地图角色同步管理和防作弊实现

    ---转自CSDN 一.前言 无论是端游.页游.手游如果是采用了MMO即时战斗游戏模式,基本都会遇到同屏多角色实时移动.释放技能.战斗等场景,于是自然也需要实现如何管理同屏内各种角色的信息同步:例如角 ...

  2. 创新手机游戏《3L》开发点滴(1)——道具、物品、装备表设计

    一.游戏物品/道具系统数据模型设计特点 为了让游戏更加的丰富,我们1201团队的新手机游戏设计了道具系统.于是丰富了游戏.取悦了玩家,哭了开发——道具/物品数据子系统是简单的.复杂的.不确定的: 简单 ...

  3. Code obfuscatio (翻译!)

    Description Kostya likes Codeforces contests very much. However, he is very disappointed that his so ...

  4. “Hello world!”团队第三周贡献分规则

    一.贡献规则制定: (1)基础分:9 , 9 , 8 , 7 , 7 , 7 , 6(按在本次编程中承担模块的重要度制定,某一模块重要度的认定通过组内开会讨论决定) (2)会议分:每人没出勤一次会议记 ...

  5. c++ string需要注意的地方

    There are multiple answers based on what you are doing with the string. 1) Using the string as an id ...

  6. c# 委托初窥

    1.委托可以把方法当作参数在另一个方法中传递和调用 ,委托是方法的快捷方式. 2.委托是一个类. private void BeginSocketThread() { try { IPEndPoint ...

  7. LintCode-53.翻转字符串

    翻转字符串 给定一个字符串,逐个翻转字符串中的每个单词. 说明 单词的构成:无空格字母构成一个单词 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括 如何处理两个单词间的多个空格 ...

  8. TCP系列25—重传—15、DSACK虚假重传探测

    一.DSACK介绍 RFC2883通过指定使用SACK来指示接收端的重复包(duplicate packet)扩展了RFC2018对SACK选项的定义(SACK选项的介绍和示例参考前面内容).RFC2 ...

  9. CentOS 6安装thrift支持erlang开发

    早前,在我的博文thrift多平台安装介绍了如何在debian/ubuntu下面安装thrift,并支持erlang开发的.而在CentOS平台下,并没有成功安装.经过不断摸索,终于成功了,这篇博文就 ...

  10. html中图片自适应浏览器和屏幕,宽度高度自适应

    1.(宽度自适应):在网页代码的头部,加入一行viewport元标签. <meta name="viewport" content="width=device-wi ...