Atcoder beginner contest 249 C-Just K(二进制枚举)
题目大意:给你N个字符串,你可以从中选择任意数量的字符串,请统计在你的字串中,相同字母出现次数正好为K次的字母数。数据保证出现的字母都是小写字母。
- 1≤N≤15
- 1 ≤K≤N
一开始读题的时候读错了,读成了至少为k次,就想的暴力选择全部字符串,然后统计字母数,但是在认真读题WA了N发后发现是恰好为K次,所以正确打开方式应该是
用二进制枚举所有选择方案,然后不断更新最大值。
因为每一个字符串在本题中只有两种状态:选(1),不选(0)
所以我们对于所有字符串总共有2^N个方案
我们随意取其中一个例子:20,将其转为二进制:10100
此时表示我们选择第一个和第三个字符串,其余字符串不选择,以这种方法我们可以将2^N次个方案全部枚举一遍,每次都统计出现字母的次数
通过,枚举每个方案
这时我们遇到了第二个问题,在每个方案中我们怎么知道每个字符串是否被选择到
这时就需要‘&’,按位与
1<<x == 2^x,二进制为100....000
1<<1 == 2,二进制为10
1<<2 == 4 二进制为100
1<<3 == 8,二进制为1000
除了第x位以外全是0,所以可以取出当前方案中的每一位,判断是否选择这个字符串,剩下的就是统计出现字母的次数了(map,数组映射都可以)
1 #include <iostream>
2 #include <map>
3 #include <algorithm>
4 #include <cstring>
5 #define int long long
6 #define endl "\n"
7 using namespace std;
8 signed main()
9 {
10 ios::sync_with_stdio(false);
11 cin.tie(0);
12 int n, m;
13 cin >> n >> m;
14 string a[25];
15 int ans = 0;
16 for (int i = 0; i < n; ++i)
17 cin >> a[i];
18 for (int i = 0; i < (1 << n); ++i)
19 {
20 int mp[26] = {0};
21 for (int j = 0; j < n; ++j)
22 {
23 if (i & (1 << j))
24 {
25 for (int k = 0; k < a[j].length(); ++k)
26 {
27 mp[a[j][k] - 'a']++;
28 }
29 }
30 }
31 int res = 0;
32 for (char j = 0; j < 26; ++j)
33 {
34 if (mp[j] == m)
35 {
36 res++;
37 }
38 }
39 ans = max(ans, res);
40 }
41 printf("%lld", ans);
42
43 return 0;
44 }
Atcoder beginner contest 249 C-Just K(二进制枚举)的更多相关文章
- AtCoder Beginner Contest 249 E - RLE // 动态规划 + 前缀和优化
传送门:E - RLE (atcoder.jp) 题意: 求满足原长为N且转换后长度严格小于N条件的小写字母组成的字符串的数量,输出时对P取模. 其中,转换规则为,将连续相同的字串替换为"字 ...
- AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆
传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 172 题解
AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...
- AtCoder Beginner Contest 238 A - F 题解
AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
- AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】
AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...
随机推荐
- 【NOI P模拟赛】寻找道路(bfs,最短路)
题面 一道特殊的最短路题. 给一个 n n n 个点 m m m 条有向边的图,每条边上有数字 0 \tt0 0 或 1 \tt1 1 ,定义一个路径的长度为这个路径上依次经过的边上的数字拼在一起后在 ...
- 【Homebrew】安装
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 官网安 ...
- 【Java】学习路径52-Timer计时器实例
import java.util.Timer; import java.util.TimerTask; public class TimerClass { public static void mai ...
- 第五十七篇:webpack打包发布
好家伙,到了打包发布这一步了 1.配置打包命令: 在package.json 文件的 scripts 节点下,新增 build 命令如下: "scripts": { "d ...
- WinUI(WASDK)项目实践——优雅的开发上位机应用(新)
摘要 这就是一个记录自己进行WinUI项目实践的博客,项目开源地址如下,觉得有帮助的可以去看看,因为项目都开源了,所以保姆级的讲解肯定不如直接看代码来的实在了. 电子脑壳项目地址 为什么叫新 因为之前 ...
- Andrej Karpathy | 详解神经网络和反向传播(基于 micrograd)
只要你懂 Python,大概记得高中学过的求导知识,看完这个视频你还不理解反向传播和神经网络核心要点的话,那我就吃鞋:D Andrej Karpathy,前特斯拉 AI 高级总监.曾设计并担任斯坦福深 ...
- IK分词器实现原理剖析 —— 一个小问题引发的思考
前言: 网上很多的文章都建议在使用IK分词器的时候,建立索引的时候使用ik_max_word模式:搜索的时候使用ik_smart模式.理由是max_word模式分词的结果会包含smart分词的结果,这 ...
- Kubernetes实践技巧:升级为集群
高可用 前面我们课程中的集群是单 master 的集群,对于生产环境风险太大了,非常有必要做一个高可用的集群,这里的高可用主要是针对控制面板来说的,比如 kube-apiserver.etcd.kub ...
- Pod原理
Pod 是 Kubernetes 集群中最基本的调度单元,我们平时在集群中部署的应用都是以 Pod 为单位的,而并不是我们熟知的容器,这样设计的目的是什么呢?为何不直接使用容器呢? 为什么需要 Pod ...
- 新版本中的hits.total匹配数说明
在7.0版发布之前,hits.total始终用于表示符合查询条件的文档的实际数量.在Elasticsearch 7.0版中,如果匹配数大于10,000,则不会计算hits.total. 这是为了避免为 ...