返回主页
题解
作者:__kevin_ 主页

题目传送门 | AtCoder

题目大意

给定一个由小写字母 abc 组成的字符串 \(S\)。求 \(S\) 的所有非空连续子串中,满足没有相邻两个字符相同的子串个数。结果对 \(998244353\) 取模。

思路

暴力的 \(O(n^2)\) 显然会超时,考虑有没有 \(O(n)\) 的做法。

注意到如果一个子串 \(S[l \dots r]\) 是合法的,则其所有前缀字符串 \(S[l \dots k]\) 也是合法的(\(k \leq r\))。

因此可将问题转化为:对于任意的 \(1 \leq l \leq |S|\),求出最大的 \(r\) 满足 \(S[l \dots r]\) 是合法的,将所有 \(r-l+1\) 累加即可。

考虑双指针。我们遍历每一个 \(l\),若 \(r < l\),则令 \(r \leftarrow l\)。使用一个循环判断当前的 \(r\) 是否能向右推进,如果可以则令 \(r \leftarrow r+1\)。统计所有的 \(r-l+1\)。

代码

AtCoder AC 记录