F.Dasha and Nightmares

题意:\(n\) 个字符串 \(s_i\),问有多少对不同的 \((i, j) \ (1 \le i \le j \le n)\),使得 \(s_i\) 和 \(s_j\)​ 拼接后的字符串满足下列条件:

  • 长度为奇数
  • 恰好出现 25 个字母
  • 每个字母出现次数为奇数

显然,如果满足后两个条件,第一个条件也满足。

由于只与是否出现和出现次数有关,不妨用两个数 \(a_i, b_i\) 代替 \(s_i\)。

\(a\) 表示出现过哪些字符,\(b\) 表示出现过哪些次数为奇的字符。

    for(char c : s) {
a[i] |= 1 << c - 'a';
b[i] ^= 1 << c - 'a';
}

如果 \(i, j\) 满足条件,则

  • 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 是无序的,所以最终答案除二(自己和自己一定不行)。

CF1800F Dasha and Nightmares的更多相关文章

  1. Div.2 C. Dasha and Password

    C. Dasha and Password time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  2. CF1100D Dasha and Chess

    题目地址:CF1100D Dasha and Chess 这是我的第一道交互题 思路不难,主要讲讲这条语句: fflush(stdout); stdout是标准输出的意思.因为有时候,我们输出到std ...

  3. Codeforces Round #394 (Div. 2) C. Dasha and Password

    C. Dasha and Password time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  4. Codeforces Round #394 (Div. 2) E. Dasha and Puzzle 构造

    E. Dasha and Puzzle 题目连接: http://codeforces.com/contest/761/problem/E Description Dasha decided to h ...

  5. Codeforces Round #394 (Div. 2) D. Dasha and Very Difficult Problem 贪心

    D. Dasha and Very Difficult Problem 题目连接: http://codeforces.com/contest/761/problem/D Description Da ...

  6. Codeforces Round #394 (Div. 2) C. Dasha and Password 暴力

    C. Dasha and Password 题目连接: http://codeforces.com/contest/761/problem/C Description After overcoming ...

  7. Codeforces Round #394 (Div. 2) B. Dasha and friends 暴力

    B. Dasha and friends 题目连接: http://codeforces.com/contest/761/problem/B Description Running with barr ...

  8. Codeforces Round #394 (Div. 2) A. Dasha and Stairs 水题

    A. Dasha and Stairs 题目连接: http://codeforces.com/contest/761/problem/A Description On her way to prog ...

  9. codeforces 761D - Dasha and Very Difficult Problem

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  10. 761A Dasha and Stairs

    A. Dasha and Stairs time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

随机推荐

  1. [Java]小功能

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/130858061 出自[进步* ...

  2. dotNet符号文件(pdb),符号包(snupkg)和SourceLink

    前言 本文的主题是 Visual Studio 调试 NuGet 包,以及符号包的概念,如何去发布一个 NuGet 包,让我们的 NuGet 包支持 SouceLink,这些都是我们开发中比较容易忽视 ...

  3. Java SM2

    pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...

  4. Win10下安装Java JDK 1.8 配置环境变量

    1.下载地址:https://www.oracle.com/java/technologies/javase-downloads.html 2.双击运行,下一步.下一步-- 3.新建变量名:JAVA_ ...

  5. KingbaseES 如何查看表的创建时间

    前言 在oracle数据库中,我们可以查看数据字典dba_objects得到表的创建时间.在Kingbase中如何查看表的创建时间呢?Kingbase数据库中无法通过数据字典查看有关信息,但可以通过其 ...

  6. KingbaseES V8R3 备份恢复系列之 -- sys_rman备份过程分析

    ​ 案例说明: 本案例通过对KingbaseES sys_rman物理备份过程的详细描述,有助于在执行sys_rman过程中发生故障的分析. 适用版本: KingbaseES V8R3 一.sys_r ...

  7. #贪心#CF1054D Changing Array

    题目 给定 \(n\) 个 \(k\) 位二进制数,\(n\leq 2*10^5,k\leq 30\) 可以选择若干数将其所有二进制位取反, 最多可以有多少个区间的异或和不为 0 分析 考虑将区间异或 ...

  8. #并查集,线性筛#nssl 1470 X

    分析 显然答案就是\(2^{连通块个数}-2\), 将每个数的质数所在的集合合并, 最后判断连通块个数即可(线性筛少了个等号改了半天QWQ) 代码 #include <cstdio> #i ...

  9. gRPC入门学习之旅(五)

    gRPC入门学习之旅(一) gRPC入门学习之旅(二) gRPC入门学习之旅(三) gRPC入门学习之旅(四) 通过之前的文章,我们已经创建了gRPC的服务端应用程序,那么应该如何来使用这个服务端应用 ...

  10. van-cell如何使用插槽

    van-cell 是 Vant 组件库中的一个单元格组件,用于展示列表中的信息.Vant 是一个轻量.可靠的移动端 Vue 组件库. 在 Vant 中,van-cell 组件提供了多个插槽(slot) ...