首页 > 其他分享 >BZOJ 4502 串 题解

BZOJ 4502 串 题解

时间:2024-09-08 22:02:25浏览次数:11  
标签:前缀 后缀 题解 trie 充要条件 4502 fail BZOJ

妙妙数数题

key:数数题通常是,对于特定形式的计数,就盯着这个模式观察,看出一些充要条件、计数形式的转化,然后想办法维护。

优化的本质就是把难算的变成好算的,把不好一起统计的(只能一个个数的)以某种角度、用某些数据结构,一起统计(多个多个数)。

我觉得难点通常在于“盯出一些充要条件”,这也是他的主要思维难度所在

如何“盯着这个模式观察”?就像解不等式一样,先不要急着去数他,先列出一个个条件,把限制条件进行充分的理解、充分的转化,再想办法维护他。

Statement

Solution

用总方案数减去重复的方案数,总方案数显然是 trie 树点数的平方。

对于两个重复的方案 \(A+B=C+D\),其中 \(|A|<|C|\)

\(D\) 是 \(B\) 的后缀

\(A\) 是 \(C\) 的前缀,即只要存在 \(C\) 就一定存在 \(A\),所以固定 \(B,D\) 算 \(C\) 的数量

设 \(E+D=B\),有 \(C\) 是 \(E\) 的后缀,这就成了一个数 \(C\) 的充要条件

即 \(C\) 的数量为 \(E\) 的 fail 树子树大小

再要求一个“\(D\) 是 \(B\) 的最长的出现过的后缀”就完美了,也就是 \(D\) 是 \(B\) 的 fail 指针指向的串

对上面这段不懂的强烈建议一句一句看,并画个图理解。


于是方法就出来了:在 AC 自动机上枚举 \(B\) 点,令 \(\text{fail}(B)=D\),设 \(B,D\) 右对齐后相差的串为 \(E\),每次答案加上 \(E\) 的 fail 树子树大小减一。

这样的 \(\sum|E|\) 是 trie 树大小级别的。

会不会算重、算漏?不会,想要证明的留作习题。


通过这几道题,我们得到启示:AC 自动机既可以处理“前缀”关系也可以处理“后缀”关系,前缀关系通过 trie 来维护,后缀关系通过 fail 树来维护;前后缀关系可以通过 把串反过来 互相转化。

标签:前缀,后缀,题解,trie,充要条件,4502,fail,BZOJ
From: https://www.cnblogs.com/laijinyi/p/18403597

相关文章

  • 题解: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\)题解列表传送门用法表格查找找到对应比赛的行找到对应......
  • AtCoder Beginner Contest 250 C~E 题解
    C-AdjacentSwaps题目大意\(N\)个球从左到右排成一列。开始时,从左往右的第\(i\)个球上写着数字\(i\)。请执行\(Q\)个操作,第\(i\)个操作如下:令\(j=~N\)个球中写着数字\(x_i\)的球的位置如果\(j=N\),将其与第\(j-1\)个球交换;否则,与第\(j+1\)个球交换。求所有操作后的球上分......