【[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时&一下状态即 ...
随机推荐
- JSON学习笔记(总结自w3school)
1. JSON是一种文本. 2. JSON即JavaScript Object Notation(JavaScript对象表示法). JSON用来存储和交换文本信息. JSON比xml更小, 更快, ...
- UIScrollView增加回弹效果
项目中经常要增加上下滑动回弹的效果: self.scrollView.alwaysBounceVertical = YES;
- MySQL报错】ERROR 1558 (HY000): Column count of mysql.user is wrong. Expected 43, found 39.
之前在centos6.4系统安装的是自带的mysql 5.1版本,后来升级到了5.6版本,执行以下命令报错 在网上查找原因说说因为升级不当导致,执行以下命令即可正常执行命令 mysql_upgrade ...
- servlet程序使用tomcat启动报错
根据书上的需求写了一些简单的servlet代码,启动时报错: 严重: A child container failed during startjava.util.concurrent.Executi ...
- 【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)
说明:很简单一个在HTTP模块中,而另外一个和HTTP 是并列的Stream模块(Nginx 1.9.0 支持) 一.两个模块的最简单配置如下 1.HTTP负载均衡: http { include m ...
- Jenkins + jmeter + ant + git 自动化集成
背景: 目前测试组项目多,手头任务紧,且回归测试任务量较大,经过组内讨论采用相对快速高效的方式(自动化接口测试类型),在迭代任务中把主要精力集中在新需求测试:而回归测试时,主要采用自动化测试,提高测 ...
- django project 的快速构建
2003年,堪萨斯(Kansas)州 Lawrence 城中的一个 网络开发小组 ——World Online 小组,为了方便制作维护当地的几个新闻站点(一般要求几天或者几小时内被建立),Adrian ...
- 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 ...
- window对象中的一些重要的属性和方法(笔记)
setTimeout()方法用来实现一个函数在指定的毫秒数之后运行:setTimeout()返回一个值,这个值可以传递给clearTimeout()用于取消这个函数的执行.由于历史原因,setTime ...
- IE10下 FormsAuthentication.SetAuthCookie无效的问
问题是这样的,我在本地测试设置身份验证票据都没问题,发布到服务器后访问地址添加了一些特殊的字符,看起来像加过密的,如下: http://www.example.com/(F(1xe9eXIxPzMAL ...