定义一个数字串为“妙”的当且仅当:该串包含某一子序列为 $2017$ ,且不包含子序列 $2016$。
定义一个数字串的“丑值”为:该串至少删去几个字符,可以使得剩余串变“妙”;如果删去任意多个字符,均无法使该串变“妙”,则该串的“丑值”是 $-1$。
给定一个长度为 $n$ 的数字串 $s$ 。有 $q$ 次询问,每次询问用 $(l_i,r_i)$ 表示。对于每次询问,回答子串 $s[l_i…r_i]$ 的“丑值”。
链接
题解
我们考虑只有一个询问而且子串是整个字符串的做法。
我们令 $dp[i][p]$ (其中 $p \in {0,1,2,3,4}$) 表示使 $p$ 最多恰好匹配到 $2017$ 的第 $p$ 个位置的最小删除代价,那么我们可以写出如下的 dp 转移方程:
$$
dp[0][0] = 1,dp[0][1] = dp[0][2] = dp[0][3] = dp[0][4] = \infty\
\begin{aligned}
dp[i][0] = &\left{\begin{aligned}
dp[i-1][0] + 1&, s_i \in {2}\
dp[i-1][0]&, s_i \not\in {2}\
\end{aligned}
\right.\
dp[i][1] = &\left{\begin{aligned}
\min(dp[i-1][0],dp[i-1][1])&,s_i \in {2}\
dp[i-1][1] + 1&,s_i \in {0}\
dp[i-1][1]&,s_i \not \in {2,0}
\end{aligned}\right.\
dp[i][2] = &\left{\begin{aligned}
\min(dp[i-1][1],dp[i-1][2])&,s_i \in {0}\
dp[i-1][2] + 1&,s_i \in {1}\
dp[i-1][2]&,s_i \not \in {0,1}
\end{aligned}\right.\
dp[i][3] = &\left{\begin{aligned}
\min(dp[i-1][2],dp[i-1][3])&,s_i \in {1}\
dp[i-1][3] + 1&,s_i \in {7,6}\
dp[i-1][3]&,s_i \not \in {1,6,7}
\end{aligned}\right.\
dp[i][4] = &\left{\begin{aligned}
\min(dp[i-1][3],dp[i-1][4])&,s_i \in {7}\
dp[i-1][4] + 1&,s_i \in {6}\
dp[i-1][4]&,s_i \not \in {6,7}
\end{aligned}\right.\
\end{aligned}
$$
如果我们把一般矩阵的 $(\mathbb Z, \cdot,+)$ 变成 $(\mathbb Z,+,\min)$ ,因为我们的转移只与这个位置的字符有关,那么我们可以写出状态矩阵 $M_i$ , 使:
$$
M_i\left[\begin{matrix}
dp[i-1][0]\
dp[i-1][1]\
dp[i-1][2]\
dp[i-1][3]\
dp[i-1][4]\
\end{matrix}\right]
\left[\begin{matrix}
dp[i][0]\
dp[i][1]\
dp[i][2]\
dp[i][3]\
dp[i][4]\
\end{matrix}\right]
$$
$s_i = 2$ 时:
$$
M_i = \left[\begin{matrix}{}
1 & \inf & \inf & \inf & \inf\
0 & 0 & \inf & \inf & \inf\
\inf & \inf & 0 & \inf & \inf\
\inf & \inf & \inf & 0 & \inf\
\inf & \inf & \inf & \inf & 0\
\end{matrix}\right]
$$$s_i = 0$ 时:
$$
M_i = \left[\begin{matrix}{}
0 & \inf & \inf & \inf & \inf\
\inf & 1 & \inf & \inf & \inf\
\inf & 0 & 0 & \inf & \inf\
\inf & \inf & \inf & 0 & \inf\
\inf & \inf & \inf & \inf & 0\
\end{matrix}\right]
$$$s_i = 1$ 时
$$
M_i = \left[\begin{matrix}{}
0 & \inf & \inf & \inf & \inf\
\inf & 0 & \inf & \inf & \inf\
\inf & \inf & 1 & \inf & \inf\
\inf & \inf & 0 & 0 & \inf\
\inf & \inf & \inf & \inf & 0\
\end{matrix}\right]
$$$s_i = 7$ 时:
$$
M_i = \left[\begin{matrix}{}
0 & \inf & \inf & \inf & \inf\
\inf & 0 & \inf & \inf & \inf\
\inf & \inf & 0 & \inf & \inf\
\inf & \inf & \inf & 1 & \inf\
\inf & \inf & \inf & 0 & 0\
\end{matrix}\right]
$$$s_i = 6$ 时
$$
M_i = \left[\begin{matrix}{}
0 & \inf & \inf & \inf & \inf\
\inf & 0 & \inf & \inf & \inf\
\inf & \inf & 0 & \inf & \inf\
\inf & \inf & \inf & 1 & \inf\
\inf & \inf & \inf & \inf & 1\
\end{matrix}\right]
$$other
$$
M_i = \left[\begin{matrix}{}
0 & \inf & \inf & \inf & \inf\
\inf & 0 & \inf & \inf & \inf\
\inf & \inf & 0 & \inf & \inf\
\inf & \inf & \inf & 0 & \inf\
\inf & \inf & \inf & \inf & 0\
\end{matrix}\right]
$$
初始矩阵:
$$
D= \left[\begin{matrix}
0\
\inf\
\inf\
\inf\
\inf\
\end{matrix}\right]
$$
对于询问,我们把矩阵扔到线段树上,因为有结合律(什么你问为什么?我也不知道),每次查询线段树即可,注意合并的时候要右边的矩阵在左,左边的矩阵在右做乘法。
事实上这道题可以支持单点修改的呢(
时间复杂度:$O(5^2 q \log n )$
代码
|
|