[Ceoi2010]Pin
#2012. [Ceoi2010]Pin
Online Judge:Bzoj-2012
Label:容斥,STL
题目描述
给出N(2<=N<=50000)个长度为4的字符串,问有且仅有D(1<=D<=4)处不相同的字符串有几对。
输入格式
第1行: N,D
以下N行每行一个字符串
输出格式
一个数:有多少对有且仅有处不相同的字符串。
样例
输入
4 2
0000
a010
0202
a0e2
输出
3
题解:
n的数据范围为50000,暴力\(O(N^2*D)\)铁T。
先转化一下问题,它问有且仅有d处不同的对数,那我们就将其转化为有且仅有4-d处相同的对数。这两个问题是完全等价的。我们考虑继续简化问题,上面这个问题难在“有且仅有”,发现可以把它转化为“有4-d处相同的对数”,然后利用容斥解决问题。
于是问题就变的很水了,由于只字符串长度固定为4,我们用二进制x表示当前考虑的是哪几位(比如\((1001)_2表示只考虑字符串的第1和第4位\)),先预处理出二进制表示的数\(x∈[0,15]\)所含的1的个数\(sz1[x]\)。
接下来枚举当前数x,然后再枚举n个字符串,根据要考虑的位进行哈希(map搞一下),然后进行计数,将考虑x这几位的贡献加入\(rc[sz1[x]]\)(\(rc[i]表示有i出相同的字符串的对数\)),最后根据组合数容斥一下,得出答案。
代码如下,详见注释↘
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[50000][5];
int sz1[20],rc[5],n,d;
map<ll,int>mp;
int main(){
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++)scanf("%s",s[i]);
for(int i=0;i<(1<<4);i++)sz1[i]=sz1[i>>1]+(i&1);//预处理含1个数
for(int i=0;i<=15;i++){
ll cnt=0;mp.clear();
for(int j=1;j<=n;j++){
ll id=0;//哈希,由于可能出现的可见字符貌似(255???)个左右,下面乘*260
for(int k=0;k<4;k++)if(i&(1<<k))id=id*260+s[j][k];
cnt+=mp[id],mp[id]++;
}
rc[sz1[i]]+=cnt;
}
//根据组合数容斥
rc[3]-=rc[4]*4;//c(4,3)
rc[2]-=rc[4]*6+rc[3]*3;//c(4,2),c(3,2)
rc[1]-=rc[4]*4+rc[3]*3+rc[2]*2;
rc[0]-=rc[4]+rc[3]+rc[2]+rc[1];
printf("%d",rc[4-d]);
}
[Ceoi2010]Pin的更多相关文章
- bzoj2012: [Ceoi2010]Pin
Description 给出N(2<=N<=50000)个长度为4的字符串,问有且仅有D(1<=D<=4)处不相同的字符串有几对. Input 第1行: N,D 以下N行每行一 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- (原创)QuartusII设置虚拟引脚(Virtual Pin)
方法一: 在Quartus II中Assignments->Assignment Editor, 在Category栏选择logic options, 到列表中To列下添加要设置的引脚接口,如果 ...
- 3.3.2 pulseIn(pin,state,timeout)
pulseIn函数用于读取引脚脉冲的时间长度,脉冲可以是HIGH或LOW.如果是HIGH,函数将先等引脚变为高电平,然后开始计时,一直到变为低电平为止.返回脉冲持续的时间长短, 单位为ms.如果超时还 ...
- Win10 IoT C#开发 3 - GPIO Pin 控制发光二极管
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一篇文 ...
- Intel pin 2.14/CentOS 6 X86-64/安装
环境:Intel Pin 2.14 CentOS 6 X86-64 --linux.tar.gz 进入 ./source/tools/ManualExamples make all TARGET=in ...
- DES MAC PIN HEX
/* void DesEncrypt( UCHAR * auchInput,UCHAR * auchKey,UCHAR * auchOutput=NULL); Function: DesEncrypt ...
- quartus II PIN脚相关之一
FPGA设计中有时候会改变输入输出名称,但是会带来一个问题,在PIN 叫配置页面上会有余留的久名称的Pin脚.如实例中,把 FPGA_CLK_50MHZ 名称修改为 FPGA_CLK,经过编译综合之后 ...
- 无线安全专题_破解篇02--kali破解pin码
最近项目有点紧,所以本应该上周发的文章,拖到了本周三,在此说声抱歉.无线安全专题,我打算系统地写六个部分,分别为破解篇,攻击篇,欺骗篇,路由篇,移动篇和蓝牙篇,当然在发布的过程中,可能还会掺杂着发布f ...
随机推荐
- java字符串简单介绍
String:String对象初始化之后不可变线程安全简单的字符串操作使用String效率更高 StringBuffer:StringBuffer对象初始化之后可改变线程安全频繁的字符串操作可以使用S ...
- 双线程DP
1.传纸条 好像是一道普及组水题? //Twenty #include<cstdio> #include<iostream> #include<cstring> # ...
- (转)I帧,P帧,B帧 .
转:http://blog.csdn.net/abcjennifer/article/details/6577934 视频压缩中,每帧代表一幅静止的图像.而在实际压缩时,会采取各种算法减少数据的容量, ...
- 尚学linux课程---5、linux操作系统介绍
尚学linux课程---5.linux操作系统介绍 一.总结 一句话总结: centos开源免费,用的特别多 1.库是什么意思? 没有执行入口的应用程序 2.linux和window下的动态库文件是什 ...
- [kuangbin带你飞]专题一 简单搜索 - D - Fliptile
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> us ...
- java编程规约一
提高开发效率,比较重视代码规范,尤其是可扩展性和可维护性,以及可读性.如果你是一个刚进公司的开发者,最好先问问前辈是否有 内部的开发规范,花点时间过一遍.即使提交代码没有review的步骤,自己心里应 ...
- Eclipse添加git插件及操作
注册账号新建仓库 在Github已经注册成功自己的账号 新建一个仓库 创建成功后记住url: 安装Git插件 首先像安装Pydev一样 点击help的Install New Software 点击Ad ...
- CoreML 简单使用
今天简单使用了下CoreML , 我的这个模型功能主要是 打开摄像头,然后对准物体,会自动帮我们识别摄像头中的物体,并且给我们大概的百分比值 代码如下: @IBAction func startCli ...
- C++开发系列-C语言的malloc与C++的new分配空间
概述 在软件开发过程中,常常需要动态地分配和撤销存储空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了较简便而功能较强的运算符ne ...
- printk 函数消息是如何记录的
printk 函数将消息写入一个 LOG_BUF_LEN 字节长的环形缓存, 长度值从 4 KB 到 1 MB, 由配置内核时选择. 这个函数接着唤醒任何在等待消息的进程, 就是说, 任何在系统 ...