1 条题解
-
0
自动搬运
来自洛谷,原作者为

5k_sync_closer
数据结构真可爱。搬运于
2025-08-24 22:19:11,当前版本为作者最后更新于2022-07-30 12:11:51,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
提供一个小常数 实现。
思路
根据题意,子串 是有魔法的,当且仅当 都相等。
维护前缀和 ,则 是有魔法的,当且仅当 都相等。
把 变形,得到 ,
任意选择一个 ,则 是有魔法的,当且仅当 。
维护 ,则 是有魔法的,当且仅当 。
考虑对于每个 ,求出满足 的 的个数。
正序枚举 ,维护一个
map,计算出 后,将答案加上map中 的个数,再将 加入map。代码
一些细节:
- 注意到
vector自带比较运算符,所以可以开map<vector<int>, int>。 - 注意到需要将字符作为
vector的下标,所以需要离散化。 - 注意到 只会用一次,所以可以动态更新 。
- 注意到存在 的情况,所以需要事先将全 集合加入
map。 - 注意取模。注意答案开
long long。
感觉其他题解都把代码写复杂了。
#include <bits/stdc++.h> #define h(x) lower_bound(a, a + k, x) - a using namespace std; vector<int> v;map<vector<int>, int> m; int n, k;long long q;char a[100050], s[100050]; int main() { scanf("%d%s", &n, s);strcpy(a, s);sort(a, a + n); m[v = vector<int>(k = unique(a, a + n) - a, 0)] = 1; for (int i = 0; i < n; ++i) { if (s[i] != a[0]) ++v[h(s[i])]; else {for (auto &x : v) --x;++v[0];} (q += m[v]++) %= 1000000007; } return printf("%lld", q), 0; }目前最优解 rk 1。
- 注意到
- 1
信息
- ID
- 5300
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者