【题解】AGC059A My Last ABC Problem
蜜蜂的解释是智慧的!
给出一个比较容易想到的解释方式。
首先把一个同颜色段缩成一个字母肯定不影响答案。
将某个串的所有位置变的相同就是 。
最后有 个相等的相邻位置,我们要改变所有相邻的不相同位置。
让相邻的 为 ( , 为 )
让相邻的 为 [, 为 ]
让相邻的 为 {, 为 }
那么 ABCCBC 可以看作 ( { } { 。
那每次都可以消掉两个对应(左右或右左)的括号消去,即将二者中间那段的字母进行变换, 使 。
这样无论如何都不会改变开头的和结尾的字母。
这样总是可以消去到只剩三个括号(四段字母)。
若剩下四段,则把不同的两个改成出现多的那种即可。
若剩下三段,若首尾相同则只需要一次,否则需要两次。
若剩下两段,只需要一次。
若剩下一段,不需要。
综上所述,答案为 。
蜜蜂的神秘解释:
可以看作一个环状序列,这样无论如何每次都能减少 2 个不同位置(如有)。
所以答案就是上述。
拿个前缀和算下段数就行了,时间复杂度 。
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,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步