题目大意
题目给了三个仅包含J, O, I三个字母的长度为\(N\)的字符串及某种crossing的规则。另外还给了一个相同长度的字符串\(N\), 且有\(Q\)次更新,每次把该字符串一个区间内的字符改成J/O/I中的某个字母,且查询是否可以通过cross初始的三个字符串得到这个新的字符串。
题目解法
本题最重要的一个observation是这里对三个字符串的crossing最多只能给出9种不一样的字符串。这是因为如果我们把J, O, I当成0, 1, 2, a cross b = (2a + 2b) % 3. 接下来的推理留给读者作为练习(雾。其实这个observation也可以从三个给定字符串都一样这个subtask推广出来。
接下来就比较简单了,相当于是检查每次更新过的字符串是否和9个可能获得的字符串中的任何一个相同。对于每种可能的字符串,我用了一个线段树维护每个区间里查询字符串与这个字符串有多少个一样的位置。这个更新很简单,我们只需要同时再有一个数组维护这个可能的字符串的每个区间里三种字母各自的数量。所以复杂度是O(\(N\) log \(N\)), 不过有一个比较大的常数9.