【[SDOI2009]Bill的挑战】
一看题解好像全是状压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的挑战】的更多相关文章
- 【BZOJ1879】[SDOI2009]Bill的挑战(动态规划)
[BZOJ1879][SDOI2009]Bill的挑战(动态规划) 题面 BZOJ 洛谷 题解 本来还想着容斥来着,这个数据范围直接暴力就好.设\(f[i][S]\)表示当前填到了第\(i\)位,和\ ...
- bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战
http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...
- 【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP
[BZOJ1879][Sdoi2009]Bill的挑战 Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含 ...
- bzoj 1879: [Sdoi2009]Bill的挑战
题目链接 bzoj 1879: [Sdoi2009]Bill的挑战 题解 n<=15,装压吧 对所有字符串进行装压 可以预处理一个数组can[i][j]表示所有的字符串中,有哪些可以在第i位匹配 ...
- [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp
Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...
- [LuoguP2167][SDOI2009]Bill的挑战_容斥原理/状压dp
Bill的挑战 题目链接:https://www.luogu.org/problem/P2167 数据范围:略. 题解: 因为$k$特别小,想到状压. 状压的方式也非常简单,就是暴力枚举. 但是会不会 ...
- bzoj 1879 [Sdoi2009]Bill的挑战(状压DP)
Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. Output ...
- [SDOI2009]Bill的挑战
题目描述 题解: 因为要求的T长度一定,可定义f[i][j] 为前i位状态为j的方案,can[i][j]表示第i为字母j,可行的状态 每次往后推就行了 #include <algorithm&g ...
- [SDOI2009]Bill的挑战——全网唯一 一篇容斥题解
全网唯一一篇容斥题解 Description Solution 看到这个题,大部分人想的是状压dp 但是我是个蒟蒻没想到,就用容斥切掉了. 并且复杂度比一般状压低, (其实这个容斥的算法,提出来源于y ...
- BZOJ.1879.[SDOI2009]Bill的挑战(状压DP)
题目链接 f定义和下面的思路一样,转移时枚举填什么字符,去更新f并算出有哪些字符串可以匹配某个状态(见code吧...). 预处理出有哪些字符串在第i位可以转移到某个字符c,dp时&一下状态即 ...
随机推荐
- 在eclipse中安装 Activiti Designer插件
转: Activiti系列——如何在eclipse中安装 Activiti Designer插件 这两天在评估jbpm和Activiti,需要安装一个Activiti Designer插件试用一下. ...
- POI上传,导入excel文件到服务器1
首先说一下所使用的POI版本3.8,需要用的的Jar包: dom4j-1.6.1.jarpoi-3.8-20120326.jarpoi-ooxml-3.8-20120326.jarpoi-ooxml- ...
- 特征选择实践---python
作者:城东链接:https://www.zhihu.com/question/28641663/answer/110165221来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 各种RF的比较
转的. 随机森林:是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定.,随机森林对回归的结果在内部是取得平均 但是并不是所有的回归都是取的平均,有些是取的和,以后会发博文来 ...
- MySQL修改端口号操作
在C盘下的program Files下找到MySQL文件夹 - my.ini配置文件有个port=3306 修改即可
- JVM体系结构和工作方式
JVM能够跨计算机体系结构来执行Java字节码,主要是由于JVM屏蔽了与各个计算机平台相关的软件或者是硬件之间的差异,使得与平台相关的耦合统一由JVM提供者来实现. 何为JVM ...
- UITableViewCell的separatorInset属性
separatorInset这个属性是IOS7后才有的属性,所以需要判断一下,才能修改 if (IOS7_OR_LATER) { cell.separatorInset = UIEdgeInsetsZ ...
- CentOS6.5本地yum源配置
1. 建立本地源目录及挂载临时目录 2. 挂载光盘 3. 进入/etc/yum.repos.d/目录,将 CentOS-Base.repo CentOS-Debuginfo.repo CentOS-V ...
- 最小割 D. Behind the Wall Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest
题目链接:http://codeforces.com/gym/101149/problem/D 题目大意: 堡垒受到攻击.堡垒是n*m的矩阵,矩阵里刚开始都是平地,然后那个数值表示在当前平地上建一面墙 ...
- Redis学习六:Redis的持久化-AOF
AOF(Append Only File) 一.是什么 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文 ...