OI

160. 匹配统计 – AcWing题库

又是一道明明很明晰却困了我一个上午的题。完了我刷蓝书的进度要被吊打了

解一 字符串Hash结合二分

O(n+m)\mathrm{O}(n+m)预处理出两个字符串的前缀哈希。对于每一个SS的后缀suf(i)suf(i),设其与TT的最大匹配长度为maxl(i)maxl(i)。容易发现二者前缀哈希是否相等具有单调性。O(logn)\mathrm{O}(\log n)二分每个后缀的答案,最后统计每种maxlmaxl的计数即可。代码实现略。

其实昨晚扫一眼题就想到了这个做法。要不是愣是要研究KMP,也不至于沦落到如此地步(

解二 KMP模式匹配与next数组

(更多…)

More
  • 2021年12月13日

昨天考试完成T4时,明明想出了正解,但又以为二叉堆时间复杂度过高不敢实现……白白浪费了几十分钟时间。事后实现,发现完全没有技术上的问题。

具体来讲,通过同时保存指向每个元素在堆中当前位置的指针,可以O(logn)\mathrm{O}(\log n)地修改和删除特定节点,以及常规的O(logn)\mathrm{O}(\log n)的弹出栈顶、插入等操作,O(1)\mathrm{O}(1)地查询堆顶元素。

下面就以动态修改无向图中每个点的度并查询最小度的点为例实现一个这样的二叉堆。

(更多…)

More
  • 2021年12月12日

基数排序是一种非比较的排序算法。它基于对每个子关键字在值域上的计数实现整体的排序。对于整数,可以在O(kn+i=1kwi)\mathrm{O}(kn + \sum\limits_{i=1}^{k}w_i)的线性时间内完成排序,其中wiw_i为每个关键字的值域大小。

以下代码将对int范围内的整数,以前1616位和后1616位为关键字进行排序。可以发现,在数据个数n7×104n \leq 7\times 10^4,其表现不如基于比较的快速排序算法。因此,在值域很大而数据较少时,应合理调整策略。

(更多…)

More
  • 2021年12月8日

说来惭愧。从国庆到现在,至少有3个人试图把我讲懂期望,但我还是只明白最基本的定义,根本不会做题。

今天发现一篇入门级别的数学期望讲解,在此转载。

More
  • 2021年11月19日

或许是人品不错,最近两天接连刷到三道排列组合相关的题。在此作简单整理。

AtCoder ABC226 F – Score of Permutations

题意参见原题面。

很自然地想到,对于一个排列P=(p1,p2,,pn)P = (p_1, p_2, \dots, p_n),有nnipii \rightarrow p_i的连边。因为排列中正整数1,2,,n1, 2, \dots, n恰好出现仅有一次,所以等价于每个点有且仅有一条出边一条入边的图。容易发现这个图由若干个有向环构成(包括自环——即pi=ip_i = i的情况)。例如排列P=(1,3,4,2)P = (1, 3, 4, 2)代表由111 \rightarrow 123422 \rightarrow 3 \rightarrow 4 \rightarrow 2两个环组成的图。

(更多…)

More
  • 2021年11月14日

是的,又是一道考试时想出正解没有打出来的题目

货物分组 – 牛客网

根据题意,我们很容易想到一个朴素的类区间DP——令dp(i,j)dp(i, j)表示现在将第ii件货物划分到第jj箱中,且作为箱内的最后一件货物,所需最小花费。容易写出转移:dp(i,j)=mink[0,i)p=k+1iapWdp(k,j1)+p=k+1iap+极差{att[k+1,i]}dp(i, j) = \min\limits_{k \in [0, i) \land \sum\limits_{p=k+1}^{i} a_p \leq W } dp(k, j-1) + \sum\limits_{p=k+1}^{i} a_p + \textrm{极差}\{a_t \mid t \in [k + 1, i]\},初值有dp(0,0)=0dp(0, 0) = 0,应求得minj[1,n]dp(n,j)\min\limits_{j \in [1, n]} dp(n, j)

(更多…)

More
  • 2021年10月22日

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

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

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

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

More
  • 2021年10月12日