codevs3160 最长公共子串
传送门: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 最长公共子串的更多相关文章
- [codevs3160]最长公共子串解题报告|后缀自动机
给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 样例就觉得不能更眼熟啊...好像之前用后缀数组做过一次 然后发现后缀自动机真的好好写啊...(当然当时学后缀数组的时候也这么认为... 这 ...
- 【codevs3160】最长公共子串 后缀数组
题目描述 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入 读入两个字符串 输出 输出最长公共子串的长度 样例输入 yeshowmuchiloveyoumydearmotherrea ...
- 【spoj2774】最长公共子串
题目描述: 给你两个字符串,求它们最长公共子串的长度,如果不存在公共子串则输出0. 样例输入: yeshowmuchiloveyoumydearmotherreallyicannotbelieveit ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- HDU 1503 带回朔路径的最长公共子串
http://acm.hdu.edu.cn/showproblem.php?pid=1503 这道题又WA了好几次 在裸最长公共子串基础上加了回溯功能,就是给三种状态各做一个 不同的标记.dp[n][ ...
- 最长公共子序列PK最长公共子串
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
随机推荐
- Notepad++删除空行的多种实现办法
Notepad++支持基础的正则表达式,同时由于自身丰富的插件和功能,所以删除空行或有空格的空行,有多种实现办法,条条大路通罗马,闪电博客抛砖引玉,供大家参考. 一.删除空行(不包括有空格类符号的空行 ...
- jquery用正则表达式验证密码强度
/** * 不加paste鼠标粘贴不起作用 * 不加input第一次粘贴的时候不变 * 加上input和focus可以兼容表情 * ke ...
- UnrealEngine4入门(一) 新建一个c++项目
epic games宣布ue4免费使用(游戏发布之后,每个季度大于3000美元则收取收益的5%)之后,吸引了大批看好VR和AR前景的游戏开发者.不过国内(中文)ue4教程和资料太少,而且一大部分资料都 ...
- 前端JQuery中获取一个div下的多个id值
获取所有的Id值,方法是通过div.class获取全局的值,然后再提取具体的Id值 方法一:用for循环,因为$("div.class")获取的是一个数组,通过循环读取出数组中的每 ...
- chromium源码阅读--图片处理
JavaScript 图像替换 JavaScript 图像替换技术检查设备能力,然后“做正确的事”. 您可以通过 window.devicePixelRatio 确定设备像素比,获取屏幕的宽度和高度, ...
- Oracle入门书籍推荐
作者:eygle |English [转载时请标明出处和作者信息]|[恩墨学院 OCM培训传DBA成功之道] 链接:http://www.eygle.com/archives/2006/08/orac ...
- StanFord 编程方法
教程下载地址:http://www.yyets.com/resource/26208 定制工具下载地址:http://www.stanford.edu/class/cs106a/cgi-bin/cla ...
- 【转】cocos2dx 3.x 集成protobuf
http://www.cnblogs.com/chevin/p/6001872.html vs2013+cocos2dx 3.13.1 这篇博文是集成Lua版本的protobuf,集成C++版本的过程 ...
- redis-20180118
1.redis hash 100% 2.redis list 100% 3.redis sentinel 20%
- dechex()
dechex() 函数把十进制转换为十六进制生成验证码的时候用到了