QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: jiangly

Posted at: 2026-04-05 16:32:33

Last updated: 2026-04-05 16:32:38

Back to Problem

题解

首先考虑怎么判断是否能使所有相邻字符不同(不考虑原串中本来就相邻的相同字符)。对于每一段问号,我们可以求出每种字符数量的上界。字符 $c$ 的数量上界即为 $\frac{r-l-[S_l=c]-[S_r=c]}{2}$,其中 $S_{l+1}$ 到 $S_{r-1}$ 是一段极长的问号。只要每一段的每种字符数量不超过上界,就可以用贪心的方式构造。因此这个问题可以转化为一个网络流问题,其中左边三个点对应 ABC,右边每个点对应一段问号,左边三个点限制容量 $X,Y,Z$,右边限制容量为问号数量,之间的边的容量即为每一段中每个字符数量的上界。能使得所有相邻字符不同当且仅当最大流等于问号的总数。最大流可以转化为最小割,枚举左边的点集,则所有询问的最小割可以在 $O(N+Q)$ 时间内求出。

进一步的,如果不能满足,则在一种排列方式中,一种字符的数量每超出上界(不取整)$1$ 个,则会多出 $2$ 对相邻的相同字符。我们可以在网络中左右两边之间加入额外的边,容量不限,费用为 $2$;对于本身上界为整数 $+\frac12$ 的边,再添加一条容量为 $1$,费用为 $1$ 的边。则最终的相邻相同字符数量就等于该网络的最小费用最大流的费用。由于该网络的性质,我们可以任意推单位费用为 $2$ 的流,因此我们只需要求出在最多能推流量为多少的单位费用不超过 $1$ 的流。这其实等于只考虑所有费用为 $0$ 或 $1$ 的边时的最大流。我们可以用之前同样的方式求出。总时间复杂度 $O(N+Q)$。

Comments

No comments yet.