一看题解好像全是状压DP,那么我就来补充一个容斥写法吧

乍一看,好像是水题,枚举选哪k个串,然后判断

1,如果这k个串中至少两个串某位置确定且不相同,答案显然为0
2,如果这个位置只被有且仅有一个串确定,这个位置就唯一确定了
3,否则这个位置有26种不同填数情况,统计答案时只要用乘法原理搞一下就行

但是容易想到,这样做是有问题的,以样例的第一组数据为例
我们选定串1,2,然后发现第四个位置确定是r,其他位置任选,但是无论我们构造出怎样的串,T总是可以同时匹配串3的

考虑容斥掉这些匹配到更多串的方案

首先,我们可以用上述方法求出匹配至少i个串的方案数,记为num[i]
我们需要统计恰好满足匹配i个的情况,记为ans[i]
现在问题来了,怎么容斥

考虑ans[i]与ans[j]的联系(i>j),定义保证ans[j]是恰好匹配j个串
如果再匹配到i-j个串,就是ans[j]
在i个串中,这i-j个串的选择当然就有C(i,i-j)种方案
我们有num[j],得出公式ans[j]=num[j]-∑C(i,i-j)*ans[i]
倒序处理ans数组即可

上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=;
int t,n,k,num[],len,c[][],ans[];
char s[][];
int ksm(int x,int t)
{
int ret=;
while(t)
{
if(t&)
ret=(ll)ret*x%mod;
x=(ll)x*x%mod,t>>=;
}
return ret%mod;
}
int check(int x)
{
char tmp[];
for(int i=;i<len;i++)
tmp[i]='?';
int rest=len;
for(int i=;i<n;i++)
{
if(x&(<<i))
for(int j=;j<len;j++)
if(!isalpha(tmp[j])&&isalpha(s[i+][j]))
{
tmp[j]=s[i+][j];
rest--;
}
else if(isalpha(tmp[j])&&isalpha(s[i+][j])&&tmp[j]!=s[i+][j])
return ;
}
return ksm(,rest);
}
int main()
{
for(int i=;i<;i++){
c[i][]=;
for(int j=;j<=i;j++){
c[i][j]=(c[i-][j-]+c[i-][j])%mod;
}
}
scanf("%d",&t);
while(t--)
{
memset(num,,sizeof(num));
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%s",s[i]);
len=strlen(s[]);
int mul=;
if(k>n)
{
printf("0\n");
continue;
}
for(int i=;i<(<<n);i++)
{
int cnt=;
for(int j=;j<n;j++)
if(i&(<<j))
cnt++;
if(cnt<k)
continue;
(num[cnt]+=check(i))%=mod;
}
for(int i=n;i>=k;i--)
{
int sum=;
for(int j=i+;j<=n;j++)
(sum+=(ll)c[j][i]*ans[j]%mod)%=mod;
ans[i]=((num[i]-sum)%mod+mod)%mod;
}
printf("%d\n",(ans[k]%mod+mod)%mod);
}
return ;
}

【[SDOI2009]Bill的挑战】的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. [SDOI2009]Bill的挑战

    题目描述 题解: 因为要求的T长度一定,可定义f[i][j] 为前i位状态为j的方案,can[i][j]表示第i为字母j,可行的状态 每次往后推就行了 #include <algorithm&g ...

  9. [SDOI2009]Bill的挑战——全网唯一 一篇容斥题解

    全网唯一一篇容斥题解 Description Solution 看到这个题,大部分人想的是状压dp 但是我是个蒟蒻没想到,就用容斥切掉了. 并且复杂度比一般状压低, (其实这个容斥的算法,提出来源于y ...

  10. BZOJ.1879.[SDOI2009]Bill的挑战(状压DP)

    题目链接 f定义和下面的思路一样,转移时枚举填什么字符,去更新f并算出有哪些字符串可以匹配某个状态(见code吧...). 预处理出有哪些字符串在第i位可以转移到某个字符c,dp时&一下状态即 ...

随机推荐

  1. JSON学习笔记(总结自w3school)

    1. JSON是一种文本. 2. JSON即JavaScript Object Notation(JavaScript对象表示法). JSON用来存储和交换文本信息. JSON比xml更小, 更快, ...

  2. UIScrollView增加回弹效果

    项目中经常要增加上下滑动回弹的效果: self.scrollView.alwaysBounceVertical = YES;

  3. MySQL报错】ERROR 1558 (HY000): Column count of mysql.user is wrong. Expected 43, found 39.

    之前在centos6.4系统安装的是自带的mysql 5.1版本,后来升级到了5.6版本,执行以下命令报错 在网上查找原因说说因为升级不当导致,执行以下命令即可正常执行命令 mysql_upgrade ...

  4. servlet程序使用tomcat启动报错

    根据书上的需求写了一些简单的servlet代码,启动时报错: 严重: A child container failed during startjava.util.concurrent.Executi ...

  5. 【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)

    说明:很简单一个在HTTP模块中,而另外一个和HTTP 是并列的Stream模块(Nginx 1.9.0 支持) 一.两个模块的最简单配置如下 1.HTTP负载均衡: http { include m ...

  6. Jenkins + jmeter + ant + git 自动化集成

     背景: 目前测试组项目多,手头任务紧,且回归测试任务量较大,经过组内讨论采用相对快速高效的方式(自动化接口测试类型),在迭代任务中把主要精力集中在新需求测试:而回归测试时,主要采用自动化测试,提高测 ...

  7. django project 的快速构建

    2003年,堪萨斯(Kansas)州 Lawrence 城中的一个 网络开发小组 ——World Online 小组,为了方便制作维护当地的几个新闻站点(一般要求几天或者几小时内被建立),Adrian ...

  8. What Does “Neurons that Fire Together Wire Together” Mean?

    What Does “Neurons that Fire Together Wire Together” Mean? I’ve heard the phrase “neurons that fire ...

  9. window对象中的一些重要的属性和方法(笔记)

    setTimeout()方法用来实现一个函数在指定的毫秒数之后运行:setTimeout()返回一个值,这个值可以传递给clearTimeout()用于取消这个函数的执行.由于历史原因,setTime ...

  10. IE10下 FormsAuthentication.SetAuthCookie无效的问

    问题是这样的,我在本地测试设置身份验证票据都没问题,发布到服务器后访问地址添加了一些特殊的字符,看起来像加过密的,如下: http://www.example.com/(F(1xe9eXIxPzMAL ...