全网唯一一篇容斥题解

Description

Solution

看到这个题,大部分人想的是状压dp

但是我是个蒟蒻没想到,就用容斥切掉了。

并且复杂度比一般状压低,

(其实这个容斥的算法,提出来源于ywy_c_asm)

(然而我知道了这个算法,竟然和他写的不一样,而且比他跑的快)

进入正题:

我们需要统计恰好满足匹配k个的情况。

那么,我们可以先找出来,恰好满足n个,n-1,n-2。。。k个的情况。

分别记为ans[i]

ans[i]怎么算呢?

先给出公式:

ans[i]=cal(i)-∑C(j,i)×ans[j] 其中,i+1<=j<=n

cal(i)表示,从n个中任意选择i个,对于所有选择的情况,的方案数的和。

cal(i)可以dfs暴力C(n,i)枚举,每次统计答案。计入tot

void dfs(int x,int has){
if(x==n+){
if(has!=up) return;
ll lp=;
for(int j=;j<=len;j++){
las=-;
for(int i=;i<=up;i++){
if(a[mem[i]][j]!='?'){
if(las==-){
las=a[mem[i]][j]-'a';
}
else if(las!=a[mem[i]][j]-'a') return;
}
}
if(las==-)lp=(lp*)%mod;
}
(tot+=lp)%=mod;
return;
}
if(has<up) {
mem[++cnt]=x;
dfs(x+,has+);
mem[cnt--]=;
}
if(n-x>=up-has) dfs(x+,has);
}

至于后面减去的部分。就是容斥的内容了。

大家可以自己画一个韦恩图理解一下。

这里有一个例子:n=4

现在我们要算ans[2],也就是恰好匹配2个的T的方案数

就是黄色的部分。

红色的数字是这个区域被算cal(i)的次数。

可见,三个点的重复区域,由于有C(3,2)种方法选到,所以会被算C(3,2)次。

所以减去所有的ans[3]即可。

其他情况同理。

最后输出ans[1]

组合数打表。

理论复杂度:
O(n×len×2^15)

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
const int M=;
const int mod=;
char a[N][M];
int len;
int n,t,k;
int mem[N],cnt;
ll ans[N];
ll c[N][N];
ll sum;
ll tot;//tot measures
int up;//choose
int las;
void dfs(int x,int has){//dfs计算tot
if(x==n+){
if(has!=up) return;
ll lp=;
for(int j=;j<=len;j++){
las=-;
for(int i=;i<=up;i++){
if(a[mem[i]][j]!='?'){
if(las==-){
las=a[mem[i]][j]-'a';
}
else if(las!=a[mem[i]][j]-'a') return;//两个字符不一样,无合法方案
}
}
if(las==-)lp=(lp*)%mod;//如果都是‘?’可以随便填,否则只有一种
}
(tot+=lp)%=mod;
return;
}
if(has<up) {
mem[++cnt]=x;
dfs(x+,has+);
mem[cnt--]=;
}
if(n-x>=up-has) dfs(x+,has);
} void clear(){
memset(ans,,sizeof ans);
sum=;
len=;
}
int main()
{
for(int i=;i<=N-;i++){
c[i][]=;
for(int j=;j<=i;j++){
c[i][j]=(c[i-][j-]+c[i-][j])%mod;
}
}
scanf("%d",&t);
while(t--){
clear();//清空数组,其实没有必要
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%s",a[i]+);
}
len=strlen(a[]+);//长度 for(int i=n;i>=k;i--){//ans[i]计算
tot=;up=i;
dfs(,);
sum=;
for(int j=i+;j<=n;j++){//容斥的处理
(sum+=c[j][i]*ans[j])%=mod;
}
ans[i]=(tot-sum+mod)%mod;
}
printf("%lld\n",ans[k]);
}
return ;
}

[SDOI2009]Bill的挑战——全网唯一 一篇容斥题解的更多相关文章

  1. [BZOJ3523][Poi2014]KLO-Bricks——全网唯一 一篇O(n)题解+bzoj最优解

    Description 有n种颜色的砖块,第i种颜色的砖块有a[i]个,你需要把他们放成一排,使得相邻两个砖块的颜色不相同,限定第一个砖块的颜色是start,最后一个砖块的颜色是end,请构造出一种合 ...

  2. 【BZOJ1879】[SDOI2009]Bill的挑战(动态规划)

    [BZOJ1879][SDOI2009]Bill的挑战(动态规划) 题面 BZOJ 洛谷 题解 本来还想着容斥来着,这个数据范围直接暴力就好.设\(f[i][S]\)表示当前填到了第\(i\)位,和\ ...

  3. bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战

    http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...

  4. 【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP

    [BZOJ1879][Sdoi2009]Bill的挑战 Description Input 本题包含多组数据.  第一行:一个整数T,表示数据的个数.  对于每组数据:  第一行:两个整数,N和K(含 ...

  5. bzoj 1879: [Sdoi2009]Bill的挑战

    题目链接 bzoj 1879: [Sdoi2009]Bill的挑战 题解 n<=15,装压吧 对所有字符串进行装压 可以预处理一个数组can[i][j]表示所有的字符串中,有哪些可以在第i位匹配 ...

  6. [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp

    Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...

  7. [LuoguP2167][SDOI2009]Bill的挑战_容斥原理/状压dp

    Bill的挑战 题目链接:https://www.luogu.org/problem/P2167 数据范围:略. 题解: 因为$k$特别小,想到状压. 状压的方式也非常简单,就是暴力枚举. 但是会不会 ...

  8. 【[SDOI2009]Bill的挑战】

    一看题解好像全是状压DP,那么我就来补充一个容斥写法吧 乍一看,好像是水题,枚举选哪k个串,然后判断 1,如果这k个串中至少两个串某位置确定且不相同,答案显然为02,如果这个位置只被有且仅有一个串确定 ...

  9. bzoj 1879 [Sdoi2009]Bill的挑战(状压DP)

    Description  Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. Output ...

随机推荐

  1. 20155301 Exp9 Web安全基础

    20155301 Exp9 Web安全基础 1.实验后回答问题 (1)SQL注入攻击原理,如何防御 答 :原理: 利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web ...

  2. # 2017-2018-2 20155319『网络对抗技术』Exp6:信息收集与漏洞扫描

    2017-2018-2 20155319『网络对抗技术』Exp6:信息收集与漏洞扫描 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.O ...

  3. Android开发——断点续传原理以及实现

    0.  前言 在Android开发中,断点续传听起来挺容易,在下载一个文件时点击暂停任务暂停,点击开始会继续下载文件.但是真正实现起来知识点还是蛮多的,因此今天有时间实现了一下,并进行记录.本文原创, ...

  4. [SPOJ2939]Qtree5

    [SPOJ2939]Qtree5 Tags:题解 题意 链接 给你\(n\)个节点的黑白树,初始全黑.每次可以翻转某点颜色,或查询距离某点最近的白点的距离.\(n\le 10^5\).强制LCT,不准 ...

  5. flask+socketio+echarts3 服务器监控程序(基于后端数据推送)

    本文地址:http://www.cnblogs.com/hhh5460/p/7397006.html 说明 以前的那个例子的思路是后端监控数据存入数据库:前端ajax定时查询数据库. 这几天在看web ...

  6. Kubernetes学习之路(二十三)之资源指标和集群监控

    目录 1.资源指标和资源监控 2.Weave Scope监控集群 (1)Weave Scope部署 (2)使用 Scope (3)拓扑结构 (4)实时资源监控 (5)在线操作 (6)强大的搜索功能 2 ...

  7. Linux 入门记录:十二、Linux 权限机制

    一.权限 权限是操作系统用来限制资源访问的机制,权限一般分为读.写.执行. 系统中每个文件都拥有特定的权限.所属用户及所属组,通过这样的机制来限制哪些用户.哪些组可以对特定的文件进行什么样的操作. 每 ...

  8. 2014.9.11 Research Meeting Report

    Dear All: Yesterday when we read INFOCOM papers, you have seen how damage it is to have careless wri ...

  9. 验证Xpath和CSS 路径是否有效

    XPath定位和CSS定位在Selenium中是经常使用的. 在FireFox浏览器和Chrome浏览器,可以使用这样的方法来验证定位是否准确. 以Chrome浏览器做范例 按键盘的F12 进入开发者 ...

  10. A1006. Sign In and Sign Out(25)

    25/25,一遍过了,很开心. #include<bits/stdc++.h> using namespace std; struct record{ string id; string ...