P4059 找爸爸

题目大意 给定两串 DNA 序列,可以在其中任意插空格,然后逐位比较,当两位都是字母时查表得到相似度。 长度为 $k$ 的空格有额外相似度 $- A - B(k - 1)$。求两序列的最大相似度。 分析 若不考虑空格的贡献,容易想到二维 DP,记 ${\rm DP}[i,j]$ 是 $A$ 串到位置 $i$ 同时 $B$ 串到位置 $j$ 时最大的相似度,有 $$ {\rm DP}[i, j] = \max\{ {\rm DP}[i - 1, j - 1] + D[i, j], {\rm DP}[i - 1, j], {\rm DP}[i, j - 1] \} $$ 当我们考虑空格的贡献时,可以发现空格的额外贡献只与前面一位有关。若两个序列此位都是空格,则把去掉后相似度一定会增加,故只有三种可能:设 ${\rm DP}_0$ 是结尾没有空格;${\rm DP}_1$ 是空格在 $A$ 串;${\rm DP}_2$ 是空格在 $B$ 串。 思考最后一个空格的转移方式,自然有方程 $$ \begin{aligned} {\rm DP}_0[i, j] &= \max\{ {\rm DP}_0[i - 1, j - 1], {\rm DP}_1[i - 1, j - 1], {\rm DP}_2[i - 1, j - 1] \} + D[i, j] \\ {\rm DP}_1[i, j] &= \max\{ {\rm DP}_0[i, j - 1] - A, {\rm DP}_1[i, j - 1]- B, {\rm DP}_2[i, j - 1] - A\} \\ {\rm DP}_2[i, j] &= \max\{ {\rm DP}_0[i - 1, j] - A, {\rm DP}_1[i - 1, j] - A, {\rm DP}_2[i, j - 1] - B \} \\ \end{aligned} $$...

October 17, 2021 · rogeryoungh

HDU6955 Xor sum

题目大意 给定整数序列 $\{a_n\}$,寻找满足区间异或和大于等于 $k$ 的连续序列中最短的。 若有多个同样长度的答案,输出位置靠前的,若不存在输出 -1。 分析 看到异或最值就应该想到 01trie。做前缀异或和,这样我们的问题就变成找到最靠近的两个数,其异或大于等于 $k$。 因为要求位置最靠前的,所以我选择倒着遍历。当遍历到第 $i$ 个数 $a_i$ 时,字典树已经维护好此位置之后的数据,即每个值出现最左边的位置。 const int maxn = 1e5 + 10, o = 30 - 1; int trie[maxn * 30][2], val[maxn * 30], tot, n, k; void insert(int ai, int i) { int p = 1; for (int j = o; j >= 0; j--) { int ch = (ai >> j) & 1; if (trie[p][ch] == 0) trie[p][ch] = ++tot; p = trie[p][ch]; val[p] = i; } } 我们只需从高位到低位遍历第 $j$ 位,分类讨论:...

October 11, 2021 · rogeryoungh