题解:AT_abc372_c [ABC372C] Count ABC Again
乍一看好像是数据结构
我们结合题目所求内容考虑。对于每次修改,能对答案产生影响的最多只能是当前字符向前和向后延伸 \(2\) 个元素所构成的长为 \(5\) 的子串。
那么我们先 \(\mathcal{O}(n)\) 计算出来初始答案。每次修改的时候,不妨先把 \(i-2\sim i\) 和 \(i-1\sim i+1\) 和 \(i\sim i+2\) 这三个子串的贡献减去,然后直接修改元素,最后重新计算这三个子串的贡献即可。
对于贡献计算的话,因为下标边界的问题,我们可以写一个函数方便处理。如下:
bool ch(int x)
{
if(x<=0||x+2>n)return 0;
return s[x]=='A'&&s[x+1]=='B'&&s[x+2]=='C';
}