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. 手机,IPAD查看eagle素材库

    把eagle素材库塞进手机里是一种什么样的体验?手机和ipad也能查看eagle素材库,随时随地查询浏览素材. 先看使用截图 实现原理: 在任意电脑,服务器或者nas中安装PicHome系统.在Pic ...

  2. Finereport11 类Excel筛选

    微信公众号:次世代数据技术 关注可了解更多的教程.问题或建议,请公众号留言或联系本人; 微信号:weibw162 本教程视频讲解可以关注本人B站账号进行观看:weibw162 一.需求描述 在使用FI ...

  3. C++ 中的 volatile 和 atomic

    C++ 中的 volatile 和 atomic 0. TL;DR std::atomic 用于多线程并发场景,有两个典型使用场景: 原子操作:对 atomic 变量的操作(读/写/自增/自减)仿佛受 ...

  4. 官宣!禅道与极狐(GitLab)达成深度合作,携手推进开源开放DevOps生态发展

    近日,禅道与著名编程开源开发平台极狐(GitLab)公司签署战略合作,双方将重点探索适用于中国用户DevOps全生命周期解决方案,并将在开源培训和教育.云服务解决方案等多个领域深度合作,共同助力国内D ...

  5. #线段树,组合计数,二项式定理#CF266E More Queries to Array

    洛谷传送门 CF266E传送门 分析 首先区间修改区间查询首选线段树 要找突破口,\((i-l+1)^k\)中\(i\)不是定值, 显然得拆开,而且\(k\)很小,根据二项式定理, \[\sum_{i ...

  6. #线段树,离线#CF1000F One Occurrence

    题目 给定一个长度为\(n\)序列,\(m\)个询问,每次询问给定一个区间\([l,r]\), 如果这个区间里存在只出现一次的数,输出这个数(如果有多个就输出任意一个),没有就输出0 分析 考虑离线, ...

  7. Response下载文件

    Response下载文件的主要步骤有七个: 1.要获取下载文件的路径 String realPath = "F:\\JavaWeb\\WorkSpace\\JavaWeb-Servlet\\ ...

  8. mysql 必知必会整理—数据插入和更新还有删除[十]

    前言 简单整理数据插入更新还有删除. 正文 插入: INSERT INTO customers( customers.cust_address, customers.cust_city, custom ...

  9. MVC过滤器简单刨析

    前言 简单介绍一下过滤器. 正文 看下过滤器类型: action: 在动作方法之前及之后执行 result: 在action结果被执行前或者之后执行,比如说返回一个视图,再执行视图前执行一个方法,再执 ...

  10. 【编程】C++ 常用容器以及一些应用案例

    介绍一些我常用的C++容器和使用方法,以及使用案例.blog 1 概述 容器(Container)是一个存储其他对象集合的持有者对象.容器以类模板实现,对支持的元素类型有很大的灵活性.容器管理元素的存 ...