子序列,贪心
给定两个字符串 $s,t$,长度分别为 $n,m(m\leq n)$,保证 $t$ 是 $s$ 的一个子序列,求子序列 $t$ 在 $s$ 中两个字符的间隔的最大值是多少。
用 $left_i$ 记录 $t$ 在 $s$ 中尽量靠左的位置,即 $t_i=s_{left_i}$ 且 $left_i$ 尽量小,用 $right_i$ 记录 $t$ 在 $s$ 中尽量靠右的位置,即 $t_i=s_{right_i}$ 且 $right_i$ 尽量大。最后取 $\max_{i=1}^{m-1}\{right_{i+1}-left_i\}$ 即可。
构造,二进制
给定 $3$ 个整数 $a,b,k(0\leq a;1\leq b;0\leq k\leq a+b\leq 2\cdot10^5)$,找到两个二进制数 $x,y(x\geq y)$ 满足:$x,y$ 都含有 $a$ 个 $0$ 和 $b$ 个 $1$,$x-y$ 恰有 $k$ 个 $1$。
构造。先固定 $x$ 为 $11\cdots 1100\cdots 00$ 的形式,然后将 $y$ 从 $x$ 开始变化。首先可以发现,将前缀连续 $1$ 的最后一个每往右移一位,$x-y$ 中 $1$ 的数量就会 $+1$,即很容易构造出 $k\leq a$ 的情况。$k>a$ 之后,每次将连续前缀 $1$ 的最后一个往后移一位 $k$ 即 $+1$,由此当 $k\in [0,a+b-2]$ 时,可以构造出答案来。注意边界情况,例如 $a=0,b=1,k=0$ 等情况。