[BZOJ3796]Mushroom追妹纸:后缀自动机+KMP
分析
这道题有个\(O(n)\)的后缀自动机做法,感觉很好理解就在这说一下。
先对\(s1\)和\(s2\)求最长公共子串,对于\(s2\)的每一个下标\(i\),求一个\(f[i]\)表示以\(s2[i]\)结尾的最长匹配长度。
KMP求出\(s3\)在\(s2\)上的所有结束位置,然后扫一遍\(s2\)统计答案,很简单。
代码
#include <bits/stdc++.h>
#define rin(i,a,b) for(register int i=(a);i<=(b);++i)
#define irin(i,a,b) for(register int i=(a);i>=(b);--i)
#define trav(i,a) for(register int i=head[a];i;i=e[i].nxt)
typedef long long LL;
using std::cin;
using std::cout;
using std::endl;
const int MAXN=50005;
int len1,len2,len3,las,tot,maxlen[MAXN],nxt[MAXN];
char s1[MAXN],s2[MAXN],s3[MAXN];
bool mat[MAXN];
struct sam{
int fa,to[26];
int len;
}a[MAXN<<1];
void extend(int c){
int p=las,np=++tot;las=np,a[np].len=a[p].len+1;
while(p&&!a[p].to[c]) a[p].to[c]=np,p=a[p].fa;
if(!p){a[np].fa=1;return;}
int q=a[p].to[c];
if(a[p].len+1==a[q].len){a[np].fa=q;return;}
int nq=++tot;a[nq]=a[q],a[nq].len=a[p].len+1,a[np].fa=a[q].fa=nq;
while(p&&a[p].to[c]==q) a[p].to[c]=nq,p=a[p].fa;
}
void kmp(){
nxt[1]=0;
for(register int i=2,j=0;i<=len3;++i){
while(j&&s3[i]!=s3[j+1]) j=nxt[j];
if(s3[i]==s3[j+1]) ++j;
nxt[i]=j;
}
for(register int i=1,j=0;i<=len2;++i){
while(j&&s2[i]!=s3[j+1]) j=nxt[j];
if(s2[i]==s3[j+1]) ++j;
if(j==len3){
mat[i]=true;
j=nxt[j];
}
}
}
void solve(){
int now=1,cur=0;
rin(i,1,len2){
while(now&&!a[now].to[s2[i]-'a']) now=a[now].fa,cur=a[now].len;
if(!now){now=1,cur=0;continue;}
now=a[now].to[s2[i]-'a'],++cur;
maxlen[i]=cur;
}
}
int main(){
scanf("%s",s1+1);
getchar();
scanf("%s",s2+1);
getchar();
scanf("%s",s3+1);
len1=strlen(s1+1);
len2=strlen(s2+1);
len3=strlen(s3+1);
las=tot=1;
rin(i,1,len1) extend(s1[i]-'a');
kmp();
solve();
int ans=0,lim=1e9;
rin(i,1,len2){
if(mat[i]) lim=len3-1;
ans=std::max(ans,std::min(maxlen[i],lim++));
}
printf("%d\n",ans);
return 0;
}
[BZOJ3796]Mushroom追妹纸:后缀自动机+KMP的更多相关文章
- BZOJ3796 Mushroom追妹纸 字符串 SA KMP
原文链接https://www.cnblogs.com/zhouzhendong/p/9253173.html 题目传送门 - BZOJ3796 题意 找一个串 $w$ 满足: 1.$w$ 是 $s_ ...
- 【bzoj3796】Mushroom追妹纸 hash/sa+kmp+二分
Description Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意--写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他从网上找到了两篇极佳的情书, ...
- bzoj 3796: Mushroom追妹纸 AC自动机+后缀自动机+dp
题目大意: 给定三个字符串s1,s2,s3,求一个字符串w满足: w是s1的子串 w是s2的子串 s3不是w的子串 w的长度应尽可能大 题解: 首先我们可以用AC自动机找出s3在s1,s2中出现的位置 ...
- BZOJ3796 Mushroom追妹纸(二分答案+后缀数组+KMP)
求出一个串使得这个串是\(s1,s2\)的子串.串中不包含\(s3\). 如果没有这个\(s3\)就可以二分答案,然后height小于二分值分一组.看看每组里是不是出现过\(s1,s2\)的后缀.判断 ...
- BZOJ3796 : Mushroom追妹纸
将S1与S2用#号拼接在一起形成S串 将S3与S串跑KMP求出S3在S串中每次出现的位置l[i] 对于S串每个后缀i,求出f[i]表示该串不包含S3串的最长前缀 然后求出S串的后缀数组 先从小到大扫描 ...
- bzoj 3796 Mushroom追妹纸——后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3796 长度一般都是 1e5 ,看这个是 5e4 ,一看就是把两个串接起来做. 自己本来想的是 ...
- bzoj 3796 Mushroom追妹纸 —— 后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3796 先把三个串拼在一起,KMP 求 s1 , s2 中每个位置和 s3 的匹配情况: 注意 ...
- 【BZOJ3796】Mushroom追妹纸 二分+hash
[BZOJ3796]Mushroom追妹纸 Description Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决 ...
- [BZOJ 3796]Mushroom追妹纸
[BZOJ 3796]Mushroom追妹纸 题目 Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他 ...
随机推荐
- tree_cuttting(树形dp求解树的重心)
Tree Cutting After Farmer John realized that Bessie had installed a "tree-shaped" network ...
- 百度之星 2019 预赛三 A 最短路 1
题目链接 分析 异或运算满足「三角不等式」. $\forall a, b, c \in \mathbb{Z}_{\ge 0}$,有 $a \xor b \le (a \xor c) + (c \xor ...
- numpy伪随机数的生成
numpy伪随机数的生成 normal函数 可以用normal来得到一个标准正态分布的4×4样本数组 >>> import numpy as np >>> samp ...
- Centos7 升级php版本到php7
一.首先查看是否有老版本 yum list installed | grep php 二.如果安装的有 yum remove php.x86_64 php-cli.x86_64 php-common. ...
- ubuntu18下lamp虚拟路劲配置
一.配置二级域名 修改hosts文件,模拟dns解析. 位置:/etc/hosts 添加 127.0.0.1 myweb.service.com 二.创建项目目录 apache默认目录是/var m ...
- 详解vue全局组件与局部组件使用方法
这篇文章主要为大家详细介绍了vue全局组件与局部组件的使用方法,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. vue全局/局部注册,以及一些混淆的组件main.js ...
- Openresrt最佳案例
第1篇:Nginx介绍 Nginx是一个高性能的Web 服务器,同时是一个高效的反向代理服务器,它还是一个IMAP/POP3/SMTP 代理服务器. 由于Nginx采用的是事件驱动的架构,能够处理并发 ...
- 在Windows与Ubuntu上使用tensorboard的不同点
(1)Ubuntu下使用TensorBoard如官网所述即可.https://www.tensorflow.org/programmers_guide/summaries_and_tensorboar ...
- git大全转
git原理:https://git-scm.com/book/zh/v2 http://blog.xiayf.cn/2013/09/28/learning-git-internals-by-examp ...
- Tomcat 使用jms 采集需要配置
Tomcat 使用JMS采集配置需要加入以后配置参数,本示例是在 eclipse 下启动tomcat中的配置. 在tomcat Arguments选择卡的VM arguments中加入: -Dcom. ...