给出两个非空字符串$s$和$t$,以最小次数删除使得字符串$s$中不会出现字符串$t$,每次可以将字符串$s$中所有任意一个字符串$t$删除,并且有多少种不同的的方案,如:删除序列$\lbrace 1,2,3\rbrace $与删除序列$\lbrace 1,2,4\rbrace $是不同的,删除序列$\lbrace 2,4,6\rbrace $和删除序列$\lbrace 2,6\rbrace $也是不同的,但删除序列$\lbrace 3,5\rbrace $与删除序列$\lbrace 5,3\rbrace $是相同的
现有$q$次询问,每次输出最小删除次数与以最小删除次数删除的方案数(对$10^9+7$取模)
程序输入的第一行是询问次数$q(1\le q \le 50 )$,接下来一行字符串$s(1 \le |s| \le 500)$和一行字符串$t(1 \le |t| \le 500)$
程序输出$q$行答案,每次输出最小删除次数与以最小删除次数删除的方案数(对$10^9+7$取模)
">Cut Substrings
Cut Substrings
Created by LXC on Mon Feb 12 09:26:40 2024
https://codeforces.com/problemset/problem/1729/G
ranting: 2100
tag: combinatorics, dp, hashing, strings, two pointers
problem
给出两个非空字符串$s$和$t$,以最小次数删除使得字符串$s$中不会出现字符串$t$,每次可以将字符串$s$中所有任意一个字符串$t$删除,并且有多少种不同的的方案,如:删除序列$\lbrace 1,2,3\rbrace $与删除序列$\lbrace 1,2,4\rbrace $是不同的,删除序列$\lbrace 2,4,6\rbrace $和删除序列$\lbrace 2,6\rbrace $也是不同的,但删除序列$\lbrace 3,5\rbrace $与删除序列$\lbrace 5,3\rbrace $是相同的
现有$q$次询问,每次输出最小删除次数与以最小删除次数删除的方案数(对$10^9+7$取模)
程序输入的第一行是询问次数$q(1\le q \le 50 )$,接下来一行字符串$s(1 \le |s| \le 500)$和一行字符串$t(1 \le |t| \le 500)$
程序输出$q$行答案,每次输出最小删除次数与以最小删除次数删除的方案数(对$10^9+7$取模)
solution
预处理匹配位置p,$p_i = 1$时,$t == s_{i-m+1, i}$,否则$p_i = 0$
令$f_i$是前i个字符中最少删除次数,$c_i$为前i个字符中满足最少删除次数的删除方案数。
答案就是$f_i, c_i$。
状态转移
- 对于$p_i = 1$
- $f_i = \min f_{j-m}+1$,条件$i-m+1\le j \le i, p_j = 1$
- $c_i = \sum c_{j-m}$,条件$i-m+1\le j \le i, p_j = 1, f_{j-m} + 1 = f_i$
- 对于$p_i = 0$
- $f_i = f_{i-1}$
- $c_i = c_{i-1}$
code
1 |
|