#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的更多相关文章

  1. bzoj2012: [Ceoi2010]Pin

    Description 给出N(2<=N<=50000)个长度为4的字符串,问有且仅有D(1<=D<=4)处不相同的字符串有几对. Input 第1行: N,D 以下N行每行一 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. (原创)QuartusII设置虚拟引脚(Virtual Pin)

    方法一: 在Quartus II中Assignments->Assignment Editor, 在Category栏选择logic options, 到列表中To列下添加要设置的引脚接口,如果 ...

  4. 3.3.2 pulseIn(pin,state,timeout)

    pulseIn函数用于读取引脚脉冲的时间长度,脉冲可以是HIGH或LOW.如果是HIGH,函数将先等引脚变为高电平,然后开始计时,一直到变为低电平为止.返回脉冲持续的时间长短, 单位为ms.如果超时还 ...

  5. Win10 IoT C#开发 3 - GPIO Pin 控制发光二极管

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一篇文 ...

  6. 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 ...

  7. DES MAC PIN HEX

    /* void DesEncrypt( UCHAR * auchInput,UCHAR * auchKey,UCHAR * auchOutput=NULL); Function: DesEncrypt ...

  8. quartus II PIN脚相关之一

    FPGA设计中有时候会改变输入输出名称,但是会带来一个问题,在PIN 叫配置页面上会有余留的久名称的Pin脚.如实例中,把 FPGA_CLK_50MHZ 名称修改为 FPGA_CLK,经过编译综合之后 ...

  9. 无线安全专题_破解篇02--kali破解pin码

    最近项目有点紧,所以本应该上周发的文章,拖到了本周三,在此说声抱歉.无线安全专题,我打算系统地写六个部分,分别为破解篇,攻击篇,欺骗篇,路由篇,移动篇和蓝牙篇,当然在发布的过程中,可能还会掺杂着发布f ...

随机推荐

  1. JavaScript 对象与函数

    对象参考手册 Array Boolean Date Math Number String RegExp Global 前言 在js中什么都是对象(包括函数). 函数是用来实现具体功能的代码,用一种方式 ...

  2. JavaScript工作原理

    HTML代码所表示的文档是一种静态文档,几乎没有交互功能,很难使页面成为动态页面.增加脚本语言,可使数据发送到服务器之前先进行处理和校验,动态地创建新的Web内容,更重要的是,引入脚本语言使我们有了事 ...

  3. thingkphp 路由实例

    我们已经了解了如何定义路由规则,下面我们来举个例子加深印象. 假设我们定义了News控制器如下(代码实现仅供参考): namespace Home\Controller; use Think\Cont ...

  4. LOJ#6437. 「PKUSC2018」PKUSC

    题面 题意转化为: 判断每个点所在的圆有多长的弧度角位于多边形内部. 然后就很暴力了. 每个点P,直接找到多边形和这个圆的所有交点,按照距离P的角度排序. 找交点,直接联立二元二次方程组.... 需要 ...

  5. python的起源及基本语句

    一.Python的起源 Python是吉多范罗苏姆于1989年的圣诞节期间在阿姆斯特丹进行编写的,于1991年编写完成,Python是一门解释型弱类型的编程语言. Python在多个领域中都有应用,比 ...

  6. 【题解】P1440 均分纸牌

    均分纸牌 题目描述: 有\(N\)堆纸牌,编号分别为\(1,2,-,N\).每堆上有若干张,但纸牌总数必为\(N\)的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为\(1\)堆上取 ...

  7. 解决ubuntu16.04鼠标键盘自动休眠导致的失灵问题

    sudo vi /etc/laptop-mode/conf.d/runtime-pm.conf 把 AUTOSUSPEND_RUNTIME_DEVTYPE_BLACKLIST="" ...

  8. AI入门---从破解AI开始

    我这里说的AI,并不是人工智能(Artificial Intelligence),只是Adobe illustrator.旁边有做设计的朋友,在他的指引下,对这个工具还颇感兴趣.就先下载个工具,闲暇时 ...

  9. vue+el-menu+vue-router实现动态导航条

    导航栏组件template <template> <div class="sidebar"> <el-menu unique-opened :defa ...

  10. 12_springmvc拦截器

    一.定义 Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理. 二.拦截器定义 实现HandlerInterceptor接口, ...