P6273 [eJOI2017] 魔法 题解
提供一个小常数
思路
根据题意,子串
维护前缀和
把
任意选择一个
维护
考虑对于每个
正序枚举 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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具