首页 > 其他分享 >BZOJ 3796 Mushroom追妹纸 题解

BZOJ 3796 Mushroom追妹纸 题解

时间:2024-09-08 22:03:05浏览次数:14  
标签:子串 le 题解 3796 追妹 height ans text

Statement

给 \(s_1,s_2,s_3\),求最长的 \(w\) 的长度,满足

  • \(w\) 是 \(s_1\) 子串
  • \(w\) 是 \(s_2\) 子串
  • \(s_3\) 不是 \(w\) 子串

Solution 1

以下是我没看题解瞎胡的

首先一个弱智想法是,枚举 \(s_1\) 上 \(w\) 的左端点,二分右端点,判定时 \(s_2\) 用 SAM,\(s_3\) 用单串 AC 自动机 / KMP。虽然复杂度不对,但是加点乱搞就能过。

然后优化,考虑在 \(s_1\) 上双指针,如何 \(O(1)\) 判定加入一个点时 \(s_3\) 是不是 \(w\) 子串?用 height 那一套求反串 lcp 即可。


Solution 2

以下是我看别的做法,转述的,不保熟

首先若没有 \(s_3\),这是经典的“多串求最长公共子串”问题,有这样两种做法:

  • 二分答案 \(x\),因为 \(\min_{l\le i\le r}\text{height}(i)\le x\),若一段极长满足 \(\text{height}(i)\le x\) 的 \(l,r\) 中同时出现 \(s_1,s_2\) 的后缀就可以。
  • 因为 \(Ans=\max_{1\le l\le r\le \text{len}}\left\{\min_{p=l+1}^r\{|\text{lcp}(p,p-1)|\} \right\}\),其中 \(l,r\) 中同时出现 \(s_1,s_2\) 的后缀,故双指针 \(l,r\),单调队列维护 \(\text{height}\) 最小值即可。(或 \(O(1)\) 查,带预处理 log)

令 \(T=s_1+\texttt{\#}+s_2\),用 KMP 处理出 \(s_3\) 在 \(T\) 中的所有出现

这时用第一种方法的话,再要求区间内没有完整出现 \(s_3\) 就行。一种方法是,若 \(s_3\) 在 \(T\) 中出现的一个起始位置为 \(x\),那么改一下 \(\text{height}\),要求 \(\text{height}(\text{rk}(x-i))<|s_3|+i\),把这些要求 \(O(n)\) 并起来就行。

另一种方法是,设 \(f(i)\) 为 \(T\) 的后缀 \(i\) 不包含 \(s_3\) 的最长前缀长度,把 ans = max(ans, height[i]) 改成 ans = max(ans, min({height[i], f[sa[i - 1]], f[sa[i]]})) 就行了。

另另一种方法是,直接用个数据结构维护。

用第二种方法的话,一样的。

标签:子串,le,题解,3796,追妹,height,ans,text
From: https://www.cnblogs.com/laijinyi/p/18403594

相关文章

  • BZOJ 4502 串 题解
    妙妙数数题key:数数题通常是,对于特定形式的计数,就盯着这个模式观察,看出一些充要条件、计数形式的转化,然后想办法维护。优化的本质就是把难算的变成好算的,把不好一起统计的(只能一个个数的)以某种角度、用某些数据结构,一起统计(多个多个数)。我觉得难点通常在于“盯出一些充要条件”,......
  • 题解:AT_arc116_b [ARC116B] Products of Min-Max
    在题库里面乱翻,就翻到了。因为在这道题里面子序列不需要考虑元素顺序,所以原序列无论是什么顺序都不会影响答案。所以先把元素按照从大到小的顺序排列,然后考虑每个元素的贡献。在当前序列中,对于元素\(a_i\),不妨设其为最小值,并去寻找它能作为哪些序列的最小值。容易发现它作为最......
  • 题解:AT_abc369_c [ABC369C] Count Arithmetic Subarrays
    很水的一道题,但是硬控我半个小时呜呜呜。它问等差数列的数量,我们发现只要找到所有的等差数列,那么答案一定包含在这些数列的连续子序列中。求所有等差数列显然可以线性,我们求出每个等差数列的长度\(n\),那么连续子序列个数即为\(n(n+1)\over2\)。至于求的话我定义了两个指针,每......
  • AtCoder Beginner Contest 253 A~E 题解
    A-Median?题目大意给定正整数\(a,b,c\),判断\(b\)是否为三个数中的中位数(即从小到大排序后是第二个,不是平均数)。\(1\lea,b,c\le100\)输入格式\(a~b~c\)输出格式如果\(b\)是三个数中的中位数,输出Yes;否则,输出No。样例\(a\)\(b\)\(c\)输出\(5\)\(3\)\(2\)Y......
  • AtCoder Beginner Contest 241 (Sponsored by Panasonic) D~F 题解
    D-SequenceQuery题目大意我们有一个空序列\(A\)。请依次处理\(Q\)个命令,每个命令有三种类型,每种类型的格式如下:1x:将\(x\)加入\(A\)(不去重)2xk:求在\(A\)的\(\lex\)的元素中,第\(k\)大的值。3xk:求在\(A\)的\(\gex\)的元素中,第\(k\)小的值。\(1\leQ\le2\times10^5......
  • AtCoder Beginner Contest 242 C~E 题解
    C-1111galpassword题目大意给定正整数\(N\),求符合下列条件的整数\(X\)的个数,对\(998244353\)取模:\(X\)是\(N\)位的正整数\(X\)的每一位数都在\([1,9]\)之间(0不行);\(X\)的相邻两位数之差的绝对值不超过\(1\)。\(2\leN\le10^6\)输入格式\(N\)输出格式输出答案。样......
  • AtCoder Beginner Contest 245 A~E 题解
    A-Goodmorning题目大意在同一天里,Takahashi在\(A\)时\(B\)分起床,Aoki在\(C\)时\(D\)分\(1\)秒起床,请问谁起床更早?\(0\leA,C<24\)\(0\leB,D<60\)输入格式\(A~B~C~D\)输出格式输出起得更早的人的名字(Takahashi或Aoki)。样例\(A\)\(B\)\(C\)\(D\)输出\(7\)......
  • AtCoder Beginner Contest 244 D~F 题解
    D-SwapHats题目大意有\(3\)个Takahashi,他们帽子的颜色分别为\(S_1,S_2,S_3\)。我们现在想通过正好\(10^{18}\)次操作,使得\(S_i=T_i\)。每次操作如下:选择\((i,j)\),交换\(S_i\)和\(S_j\)。试问能否达成目标?输入格式\(S_1~S_2~S_3\)\(T_1~T_2~T_3\)输出格式如果能达......
  • ARC138 B - 01 Generation 题解
    ARC138B-01Generation思路考虑逆向思维,很容易想到可以优先从后面删掉0(操作B的逆向操作),然后如果前面是0则删掉它并将序列翻转(操作A的逆向操作),一直重复这两个步骤直到字符串为空。如果中途无法操作,输出No,否则输出Yes。下面我们来证明这个方法的正确性:首先,假设有一个序列\(A......
  • AtCoder题解集锦
    注:本文原发表于CSDN,现已停止更新。原文如下:AtCoder题解集锦自己从全网整理的一些优质AtCoder题解,目前只有ABC(AtCoderBeginnerContest)的C~F。不定期更新。如您有更多需求,欢迎私信我或在评论区留言!\(\rarr\)题解列表传送门用法表格查找找到对应比赛的行找到对应......