CF1800F Dasha and Nightmares
F.Dasha and Nightmares#
题意:
- 长度为奇数
- 恰好出现 25 个字母
- 每个字母出现次数为奇数
显然,如果满足后两个条件,第一个条件也满足。
由于只与是否出现和出现次数有关,不妨用两个数
for(char c : s) {
a[i] |= 1 << c - 'a';
b[i] ^= 1 << c - 'a';
}
如果
a[i] | a[j]
恰好 25 位。a[i] | a[j] = b[i] ^ b[j]
。
枚举没出现的那一位 k,则
a[i] >> k & 1 = 0
a[j] >> k & 1 = 0
a[i] | a[j] = b[i] ^ b[j] = ((1 << 26) - 1) ^ (1 << k)
令 val = ((1 << 26) - 1) ^ (1 << k)
一个第 k 位为 0 的 a[i] 对答案的贡献是满足以下条件的 j 的个数
a[j] >> k & 1 = 0
b[j] = val ^ b[i]
用哈希表或者桶记录先前 b 出现的次数即可。
rep(k, 0, 25) {
int val = ((1 << 26) - 1) ^ 1 << k;
vector<int> t;
rep(i, 1, n) {
if(a[i] >> k & 1 ^ 1) {
++ cnt[b[i]];
t.pb(b[i]);
}
}
for(int x : t) ans += cnt[val ^ x];
for(int x : t) cnt[x] = 0;
}
我这里由于 i,j 是无序的,所以最终答案除二(自己和自己一定不行)。
标签:
codeforces
, 位运算
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】