传送门: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. nginx error_page

    1. error_page语法 语法: error_page code [ code... ] [ = | =answer-code ] uri | @named_location 默认值: no 使 ...

  2. python,批量生成指定格式的审核数据(传输参数格式为数组时)

    #思路#获取list长度(例如列表有20条数据,则生成20条数据),生成数组长度为list元素的数据,完成对列表20条数据的批量审核def createBatchData(self,str_in,li ...

  3. Assetbundle1

    AssetBundle运行时加载:来自文件就用CreateFromFile(注意这种方法只能用于standalone程序)这是最快的加载方法也可以来自Memory,用CreateFromMemory( ...

  4. linux ----- Vim进入和退出命令

    Vim进入和退出命令     本来不想写任何关于vim的文章的,无奈我今天又忘记怎么退出vim了,常用命令是ESC,然后:wq(保存并退出),:q!(不保存并强制退出),i进入vim模式.另外还有其它 ...

  5. [C/C++] new/delete和malloc/free基本区别

    /**便于遗忘时复习**/ 区别一:本质 new/delete 在C++中是运算符不是函数,需要编译器支持.malloc/free是库函数,需要头文件支持,在C语言中使用. 区别二:开辟内存大小 用 ...

  6. CentOS7安装配置SonarQube

    一.SonarQubeServer 1.前提 安装好mysql5.7和jdk1.8. (1)安装Mysql create user 'sonar'@'localhost' identified by ...

  7. Daily Scrum02 12.01

    今天是2013年12月的第一天,希望大家都有一个新的开始,一起努力!     Member Today's Task Tomorrow's Task 李孟 Task 856: 熟悉单元测试方法熟悉单元 ...

  8. zuoyebiji

  9. npm基本使用

    常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用. 允许用户将自己编写的包或命令行程序上传到NPM服 ...

  10. JSP表单提交出现中文乱码的解决方法

    1)post方式 在servlet的doGet( )  doPost( )  中增加以下代码: response.setContentType("text/html;charset=utf- ...