标签: Trie

  • MOCK NOIP 20221108 日志

    中规中矩的一场模拟赛。

    T1 写得实在是太久了……这也是没办法的事情——如果不对转移作压缩优化就没办法过。

    T2 有我喜欢的马拉车 Manacher 算法,是印象里第二次在模拟赛应用。

    然后就没时间了。后两题仍然只有暴力分,但最近频繁遇到跟凸包和线性函数相关的题目,这使我发现 T3 跟它相关。在最后一点时间里实现了构建凸包的函数。代码本身没问题,但思路是错误的。

    简略题解

    A – 石蒜反冲

    这好像是很早以前的译名了。现在它叫《莉可丽丝》。

    遇见多模式串匹配,自然想到自动机上 DP。但我们发现题目中给定的两个串 sakana chinanago 在任何一个文本串中最多只能匹配其中一个,且匹配位置唯一。于是简单计数 DP 转移,记录当前二者匹配数之差与目前匹配位置即可。

    一些不应用就过不了的优化:

    • 二者数量之差可只记录到 $\frac{n}{15}$。$15$ 是两个串的总长度。
    • 转移时对于 ? s c a o 还有其他字符分类讨论,保证单次转移复杂度为 $\newcommand\bigO{\operatorname{O}}\bigO(1)$。

    时间复杂度 $\bigO(n^2)$。 (更多…)

  • CF201D Brand New Problem 简略题解

    Problem D – Codeforces Round #127 (Div. 1)

    多模式串匹配,是不是又是AC自动机啊?

    显然,每个文本串中,模式串的排列构成的子序列的逆序对数量只和模式串有关。所以我们可以对模式串建立Trie树,每扫入一个文本串的单词就进行匹配。可以做到$\mathrm{O}(K)$,K为文本串总长(虽然单个字符串的长度极小可以$\mathrm{O}(NK)暴跳$)。这样就构建出一个由$1$到$n$构建的数列。

    枚举$15!$的全排列然后暴搜显然不可行。我们注意到,如果钦定一个数$x$,只要知晓当前的排列中前$j$位分别是哪些数,就可以立刻算出$x$加入排列后新增的逆序对数量。则我们考虑状压DP。 (更多…)