先把两个串能匹配模式串的位置找出来,然后标记为$1$(标记在开头或末尾都行),然后对标记数组求一个前缀和,这样可以快速查到区间内是否有完整的一个模式串。

然后二分子串(答案)的长度,每次把长度为$md$的串扔到哈希表里,查一波匹不匹配。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ull unsigned long long
#define ll long long
#define R register int
using namespace std;
const int M=,N=,B=;
namespace HASH {
const int P=;
int fir[P],nxt[M],cnt; ull vl[M];
inline void clear() {memset(fir,,sizeof(fir)),memset(nxt,,sizeof(int)*(cnt+)),memset(vl,,sizeof(ull)*(cnt+)),cnt=;}
inline void ins(ull x) {
R st=x%P; for(R i=fir[st];i;i=nxt[i]) if(vl[i]==x) return ;
vl[++cnt]=x,nxt[cnt]=fir[st],fir[st]=cnt;
}
inline int find(ull x) {R st=x%P; for(R i=fir[st];i;i=nxt[i]) if(vl[i]==x) return ; return ;}
} int l1,l2,ls,nxt[N/],c1[N],c2[N];
char s1[N],s2[N],s[N/];
ull h1[N],h2[N],p[N];
inline void PRE() {
for(R i=,j=;i<=ls;++i) {
while(j&&(s[i]!=s[j+])) j=nxt[j];
if(s[i]==s[j+]) ++j; nxt[i]=j;
}
}
inline void calc() {
for(R i=,j=;i<=l1;++i) {
while(j&&(j==ls||s1[i]!=s[j+])) j=nxt[j];
if(s1[i]==s[j+]) ++j;
if(j==ls) ++c1[i];
} for(R i=;i<=l1;++i) c1[i]+=c1[i-];
for(R i=,j=;i<=l2;++i) {
while(j&&(j==ls||s2[i]!=s[j+])) j=nxt[j];
if(s2[i]==s[j+]) ++j;
if(j==ls) ++c2[i];
} for(R i=;i<=l2;++i) c2[i]+=c2[i-];
}
inline bool ck(int md) {
for(R i=md;i<=l1;++i) if(md<ls||c1[i]-c1[i-md+ls-]==) HASH::ins(h1[i]-h1[i-md]*p[md]);
for(R i=md;i<=l2;++i) if(md<ls||c2[i]-c2[i-md+ls-]==) if(HASH::find(h2[i]-h2[i-md]*p[md])) return true;
HASH::clear(); return false;
}
signed main() {
scanf("%s%s%s",s1+,s2+,s+);
l1=strlen(s1+),l2=strlen(s2+),ls=strlen(s+);
PRE(),calc(); p[]=; for(R i=;i<=;++i) p[i]=p[i-]*B;
for(R i=;i<=l1;++i) h1[i]=h1[i-]*B+s1[i];
for(R i=;i<=l2;++i) h2[i]=h2[i-]*B+s2[i];
R l=,r=min(l1,l2)+; while(l<r) {R md=l+r>>; if(ck(md)) l=md+; else r=md;}
printf("%d\n",l-);

2019.06.12

BZOJ 3796 Mushroom追妹纸 哈希+二分(+KMP)的更多相关文章

  1. [BZOJ 3796]Mushroom追妹纸

    [BZOJ 3796]Mushroom追妹纸 题目 Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他 ...

  2. ●BZOJ 3796 Mushroom追妹纸

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3796 题解: 题意:    给出三个串 A,B,C    找出一个最长串 S,    使得 ...

  3. bzoj 3796 Mushroom追妹纸——后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3796 长度一般都是 1e5 ,看这个是 5e4 ,一看就是把两个串接起来做. 自己本来想的是 ...

  4. bzoj 3796 Mushroom追妹纸 —— 后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3796 先把三个串拼在一起,KMP 求 s1 , s2 中每个位置和 s3 的匹配情况: 注意 ...

  5. bzoj 3796: Mushroom追妹纸 AC自动机+后缀自动机+dp

    题目大意: 给定三个字符串s1,s2,s3,求一个字符串w满足: w是s1的子串 w是s2的子串 s3不是w的子串 w的长度应尽可能大 题解: 首先我们可以用AC自动机找出s3在s1,s2中出现的位置 ...

  6. bzoj 3796: Mushroom追妹纸【二分+后缀数组+st表】

    把三个串加上ASCII大于z的分隔符连起来,然后求SA 显然每个相同子串都是一个后缀的前缀,所以枚举s1的每个后缀的最长和s2相同的前缀串(直接在排序后的数组里挨个找,最近的两个分别属于s1和s2的后 ...

  7. [BZOJ3796]Mushroom追妹纸:后缀自动机+KMP

    分析 这道题有个\(O(n)\)的后缀自动机做法,感觉很好理解就在这说一下. 先对\(s1\)和\(s2\)求最长公共子串,对于\(s2\)的每一个下标\(i\),求一个\(f[i]\)表示以\(s2 ...

  8. 【BZOJ3796】Mushroom追妹纸 二分+hash

    [BZOJ3796]Mushroom追妹纸 Description Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决 ...

  9. 【bzoj3796】Mushroom追妹纸 hash/sa+kmp+二分

    Description Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意--写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他从网上找到了两篇极佳的情书, ...

随机推荐

  1. Gym 101142 I.Integral Polygons(计算几何)

    题意:给定一个凸包,现在让你连接凸包上两点,把凸包变为两个多边形,满足两个多边形的面积都是整数. 思路:我们知道整点的三角形面积S=叉积/2,则S要么是整数,要么是整数+0.5.那么多边形有多个三角形 ...

  2. Angular Chart 使用说明(基于angular工程)

    Angular Chart是基于Chart.js的angular组件,引入项目后直接操作数据即可. 引用方法:    分别将Chart.js.angular-chart.js.angular-char ...

  3. oddjob之smooth关闭程序

    java程序的smooth关闭策略可以采用hook跟观察者的模式实现 无限等状态,如果状态出现可以关闭的事件则进行关闭 虚拟机的关闭通过钩子调用关闭,如果关闭失败,在超时时间内强制杀掉jvm 状态类 ...

  4. bzoj 2716 [Violet 3]天使玩偶——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 第三道KDtree!仍旧是模板.还有CDQ分治做法,见下面. 数组迷之开大?(开6e5 ...

  5. 编译Python出现Tab,空格的问题

    我们编译python代码时, 经常出现各种因为tab和空格的问题, 例如: IndentationError: unindent does not match any outer indentatio ...

  6. PID控制及整定算法

    一.PID控制算法 PID是比例.积分.微分的简称,PID控制的难点不是编程,而是控制器的参数整定.参数整定的关键是正确地理解各参数的物理意义,PID 控制的原理可以用人对炉温的手动控制来理解.阅读本 ...

  7. springMVC绑定json参数之二(2.2.1)

    二.springmvc 接收不同格式的json字符串 2.扫盲完了继续测试springmvc 接收不同格式的json字符串 1).格式一:json简单数组对象 前台两种传递方式: 方式一(需要拼接js ...

  8. idea2016 64位 安装,jdk环境变量配置

      idea 激活服务器地址: 地址1: http://www.iteblog.com/idea/key.php     地址2:  http://idea.qinxi1992.cn/ intelli ...

  9. IPSec方案部署(多业务场景)

    技术点详解—IPSec方案部署 通过前面几期的介绍可以发现IPSec所涉及的参数很多,在具体方案部署过程中有许多灵活选择的地方,本期专栏就专门对IPSec在几种典型环境中的方案部署进行介绍. 一.   ...

  10. free查看内存情况

    free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区. free [option]     -b:以Byte为单位显示内存使用情况:      -k:以KB为单位显 ...