【题解】AGC059A My Last ABC Problem
蜜蜂的解释是智慧的!
给出一个比较容易想到的解释方式。
首先把一个同颜色段缩成一个字母肯定不影响答案。
将某个串的所有位置变的相同就是 $a_1=a_2=a_3=\dots = a_n$。
最后有 $n-1$ 个相等的相邻位置,我们要改变所有相邻的不相同位置。
让相邻的 $\texttt{AB}$ 为 ( , $\texttt{BA}$ 为 )
让相邻的 $\texttt{AC}$ 为 [, $\texttt{CA}$ 为 ]
让相邻的 $\texttt{BC}$ 为 {, $\texttt{CB}$ 为 }
那么 ABCCBC 可以看作 ( { } { 。
那每次都可以消掉两个对应(左右或右左)的括号消去,即将二者中间那段的字母进行变换, $\texttt{AB\{CC\}BC}$ 使 $\texttt C\to\texttt B$。
这样无论如何都不会改变开头的和结尾的字母。
这样总是可以消去到只剩三个括号(四段字母)。
若剩下四段,则把不同的两个改成出现多的那种即可。
若剩下三段,若首尾相同则只需要一次,否则需要两次。
若剩下两段,只需要一次。
若剩下一段,不需要。
综上所述,答案为 $\lceil \frac{d + [a_l\neq a_r]}{2}\rceil$。
蜜蜂的神秘解释:
可以看作一个环状序列,这样无论如何每次都能减少 2 个不同位置(如有)。
所以答案就是上述。
拿个前缀和算下段数就行了,时间复杂度 $O(n+q)$。
read(n , q);
read(S + 1) ;
cnt[1] = 1 ;
rep(i,2,n) {
cnt[i] = cnt[i - 1] + (S[i] != S[i - 1]) ;
}
while(q --) {
static int l , r;
read(l , r);
static int dif ;
dif = cnt[r] - cnt[l - 1] - (S[l] != S[l - 1]) ;
wrt(S[l] == S[r] ? (dif + 1) / 2 : dif / 2 + 1 , '\n') ;
}
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17970964,谢谢你的阅读或转载!

浙公网安备 33010602011771号