1 条题解
-
0
题意回顾
给定一个只包含字符 的字符串 ,长度 。
求有多少个连续子串是好的——即子串中出现的各种字符的出现次数完全相同。
关键观察与转化
1. 数学表示
设子串 中:
- 字符 的出现次数
- 字符 的出现次数
- 字符 的出现次数
"好的"条件等价于:
2. 前缀和表示
定义前缀和:
- 前 个字符中 的个数
- 前 个字符中 的个数
- 前 个字符中 的个数
对于子串 : $ \begin{aligned} \text{cnt}_a &= A[r] - A[l-1] \\ \text{cnt}_b &= B[r] - B[l-1] \\ \text{cnt}_c &= C[r] - C[l-1] \end{aligned} $
条件变为:
3. 变量消元与差分表示
由 可得:
由 可得:
定义两个差分量: $ \begin{aligned} X[i] &= A[i] - B[i] \\ Y[i] &= A[i] - C[i] \end{aligned} $
则对于子串 ,"好的"条件等价于:
问题转化
我们需要统计满足以下条件的 对数():
其中 。
高效算法
核心思路
对于每个右端点 ,统计有多少个 满足:
这可以用哈希表(或
map)来维护每个 状态的出现次数。
算法步骤
-
初始化:
-
遍历右端点 从 到 :
- 根据 更新 和 :
- 若 :
- 若 : 不变
- 若 : 不变,
- 根据 更新 和 :
正确性说明
当遇到某个 状态时,之前所有出现相同状态的位置 都与当前 构成"好的"子串 。
累加这些数量即得到所有以 结尾的"好的"子串数,求和即得答案。
复杂度分析
- 时间复杂度:,使用
unordered_map可达 - 空间复杂度:,存储不同状态
总结
本题的关键在于:
- 将"各字符出现次数相同"转化为前缀和的差分条件
- 通过定义 和 将三维条件降为二维
- 使用哈希表统计相同状态的出现次数
- 在线性时间内解决问题,可处理 的大数据
- 1
信息
- ID
- 4200
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 8
- 已通过
- 1
- 上传者