#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. Android 开发 框架系列 OkHttp文件下载功能实现(含断点续传)

    前言 此篇博客只是下载功能的记录demo,如果你还不太了解okhttp可以参考我的另一篇博客https://www.cnblogs.com/guanxinjing/p/9708575.html 代码部 ...

  2. badboy录制添加检查点

    前提条件 安装badboy 下载地址:http://www.badboy.com.au/download/index 录制脚本 1.例:录制www.baidu.com 2.打开badboy工具输入录制 ...

  3. [CTSC 2012]熟悉的文章

    二分+单调队列优化dp+后缀自动机 //CTSC2012 熟悉的文章 #include <bits/stdc++.h> using namespace std; const int max ...

  4. 牛客多校第六场 A Garbage 模拟/签到

    题意: 给你一个字符串,代表一个垃圾都有哪些物质组成,再给你一个字符串,代表a-z代表的物质分别是有害物质,干物质还是湿物质,根据题目的定义,回答是什么垃圾. 题解: 根据题意模拟即可. #inclu ...

  5. js 定位到某个锚点的方法

    html页面内可以设置锚点,锚点定义 Html代码  ? 1 <a name="firstAnchor">&nsbp;</a> 锚点使用 Html代 ...

  6. javascript中onclick(this)用法和onclick(this.value)用法介绍

    onclick(this.value)代码详解 <html> <head> <script language="javascript"> fun ...

  7. VS2010-MFC(MFC常用类:MFC异常处理)

    转自:http://www.jizhuomi.com/software/236.html 上一节讲了CFile文件操作类,本节主要来说说MFC异常处理. 在鸡啄米C++编程入门系列的最后一节鸡啄米:C ...

  8. Oracle一条数据多表连插

    insert all into T_TRAIN_MARSHALLING <trim prefix="(GKEY," suffix=")" suffixOv ...

  9. Git远程仓库版本回退

    1.首先将本地仓库版本回退到自己想要的版本. git reset commit_id 2.将回退后的版本强制推送到远程仓库. git push -f origin master

  10. AQS(队列同步器)

    目录导引: 一.简介 二.源码解析(JDK8) 三.运用示例 一.简介 1.volatile volatile修饰的共享变量可以保证可见性和有序性(禁止指令重排序). 2.CAS: CAS的原理很简单 ...