传送门:http://codevs.cn/problem/3160/

【题解】

CTSC前复习模板

sa的模板。。记住基数排序就够了(还有height)

还有就是sa[i]表示排名为i的后缀是啥。。rnk[i]表示suf(i)排第几

至于其他。。看造化了

大多数关于两个串的都要把它们接起来,然后上SA。

(两个串瞎jb匹配明明还可以FFT嘛)

那么这题。。按套路就是这么走的

可是怎么计算贡献呢

我们发现这样一个事情:

如果suf(sa[i]),suf(sa[j])有公共部分,那么一定不比suf(sa[i],suf(sa[j+1])劣。

我们按照后缀排序后,如果sa[i],sa[i+1]一个处于前半(s1),一个处于后半(s2),那么就是一个合法的匹配,更新答案。

另:还是不会SAM

# include <stdio.h>
# include <string.h>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 2e5 + ;
const int mod = 1e9+; # define RG register
# define ST static char s1[M], s2[M];
char str[M];
int n, len1, len2; namespace SA {
// rnk[i]: i后缀排名多少;sa[i]: 排名为i的后缀是哪个
int rnk[M], sa[M], h[M], tsa[M], A[M], B[M];
int cntA[M], cntB[M];
inline void set() {
memset(cntA, , sizeof cntA);
for (int i=; i<=n; ++i) ++cntA[str[i]];
for (int i=; i<=; ++i) cntA[i] += cntA[i-];
for (int i=n; i; --i) sa[cntA[str[i]] --] = i;
rnk[sa[]] = ;
for (int i=; i<=n; ++i) {
rnk[sa[i]] = rnk[sa[i-]];
if(str[sa[i]] != str[sa[i-]]) ++rnk[sa[i]];
}
for (int len=; rnk[sa[n]] < n; len<<=) {
memset(cntA, , sizeof cntA);
memset(cntB, , sizeof cntB);
for (int i=; i<=n; ++i) {
cntA[A[i] = rnk[i]] ++;
cntB[B[i] = ((i + len <= n) ? rnk[i+len] : )] ++;
}
for (int i=; i<=n; ++i) cntA[i] += cntA[i-], cntB[i] += cntB[i-];
for (int i=n; i; --i) tsa[cntB[B[i]] --] = i;
for (int i=n; i; --i) sa[cntA[A[tsa[i]]] --] = tsa[i];
rnk[sa[]] = ;
for (int i=; i<=n; ++i) {
rnk[sa[i]] = rnk[sa[i-]];
if(A[sa[i]] != A[sa[i-]] || B[sa[i]] != B[sa[i-]]) ++rnk[sa[i]];
}
}
for (int i=, j=; i<=n; ++i) {
if(j) --j;
while(str[i+j] == str[sa[rnk[i]-]+j]) ++j;
h[rnk[i]] = j;
}
}
} int main() {
scanf("%s", s1);
len1 = strlen(s1);
for (int i=; i<len1; ++i) str[++n] = s1[i];
str[++n] = ;
scanf("%s", s2);
len2 = strlen(s2);
for (int i=; i<len2; ++i) str[++n] = s2[i];
SA::set();
int bet = len1 + , ans = ;
for (int i=; i<n; ++i) {
if((SA::sa[i] < bet && SA::sa[i+] > bet) || (SA::sa[i] > bet && SA::sa[i+] < bet))
ans = max(ans, SA::h[i+]);
}
printf("%d\n", ans);
return ;
}

codevs3160 最长公共子串的更多相关文章

  1. [codevs3160]最长公共子串解题报告|后缀自动机

    给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 样例就觉得不能更眼熟啊...好像之前用后缀数组做过一次 然后发现后缀自动机真的好好写啊...(当然当时学后缀数组的时候也这么认为... 这 ...

  2. 【codevs3160】最长公共子串 后缀数组

    题目描述 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入 读入两个字符串 输出 输出最长公共子串的长度 样例输入 yeshowmuchiloveyoumydearmotherrea ...

  3. 【spoj2774】最长公共子串

    题目描述: 给你两个字符串,求它们最长公共子串的长度,如果不存在公共子串则输出0. 样例输入: yeshowmuchiloveyoumydearmotherreallyicannotbelieveit ...

  4. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  5. HDU 1503 带回朔路径的最长公共子串

    http://acm.hdu.edu.cn/showproblem.php?pid=1503 这道题又WA了好几次 在裸最长公共子串基础上加了回溯功能,就是给三种状态各做一个 不同的标记.dp[n][ ...

  6. 最长公共子序列PK最长公共子串

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...

  7. 动态规划(一)——最长公共子序列和最长公共子串

    注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...

  8. 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774

    Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...

  9. 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message

    Language: Default Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 21 ...

随机推荐

  1. python 产生有序整数序列

    其中一种方法 A = np.linspace(0,n,n)

  2. express与ejs,ejs在Linux上面的路径问题

    1.学习使用ejs模板(这个是ejs.js) var express = require('express'); var app = express(); app.set("view eng ...

  3. leetcode 笔记5 single number

    question: Given an array of integers, every element appears twice except for one. Find that single o ...

  4. 【实用】如何将sublime text 3 打造成实用的python IDE 环境

    前段时间写脚本,一直使用的是pycharm ,无奈机器不配置实在不怎么样,我记得之前用过subline text,这是我用过的最酷炫的文本编辑器,参考了一下网上的文章,自己走了一些弯路,将心得写在这里 ...

  5. OpenCV入门:(六:基础画图函数)

    有时程序中需要画一些基础的图形,例如直线,矩形,椭圆以及多边形.OpenCV中当然有此类函数. 1.函数介绍 直线line: , , ) img – 图像 pt1 – 直线起点 pt2 – 直线终点 ...

  6. 「个人训练」Can you solve this equation?(HDU-2199)

    题意与分析 纯粹水题.本来想做下放松心情的,结果还是被坑了qaq 重点就是在浮点误差.比较左右的下次就直接上1e-10,别看着题目说1e-4然后给个-5,结果暴wa.气傻了..... 代码 #incl ...

  7. VIN码识别:助力汽车后市场转型升级

    随着中国汽车市场的成熟,汽车后市场发展迅速,呈“井喷”式增长.据最新数据统计,2015年,中国汽车后市场产值突破8000亿规模,到2018年有望突破万亿. 所谓汽车后市场是指汽车销售以后,围绕汽车使用 ...

  8. Linux-获得命令帮助man

    date:显示当前系统时间,修改时间 clock,hwclock:显示硬件时间 cal:calendar,查看日历 计时器靠晶体振荡器来完成计时 Linux: 实时时钟,rtc,real time c ...

  9. react实现页面切换动画效果

    一.前情概要 注:(我使用的路由是react-router4)     如下图所示,我们需要在页面切换时有一个过渡效果,这样就不会使页面切换显得生硬,用户体验大大提升:     but the 问题是 ...

  10. 【Linux运维】Centos7上借助ansible搭建LVS+Keepalived

    安装ansible 安装ansible: [root@localhost ~]# /etc/hosts 192.168.19.129 web129.yanglt.com web129 192.168. ...