bzoj 1879: [Sdoi2009]Bill的挑战【状压dp】
石乐志写容斥……其实状压dp就行
设f[i][s]表示前i个字母,匹配状态为s,预处理g[i][j]为第i个字母是j的1~n的集合,转移的时候枚举26个字母转移,最后答案加上正好有k个的方案即可
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod=1000003;
int T,n,m,len,t,f[55][50005],g[55][27],ans;
char c[20][55];
void jia(int &x,int y)
{
	x+=y;
	if(x>mod)
		x-=mod;
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		memset(f,0,sizeof(f));
		memset(g,0,sizeof(g));
		ans=0;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
			scanf("%s",c[i]+1);
		len=strlen(c[1]+1);
		f[0][(1<<n)-1]=1;
		for(int i=1;i<=len;i++)
			for(int j=0;j<26;j++)
				for(int k=1;k<=n;k++)
					if(c[k][i]=='a'+j||c[k][i]=='?')
						g[i][j]|=1<<(k-1);
		for(int i=1;i<=len;i++)
			for(int j=0,l=(1<<n);j<l;j++)
				if(f[i-1][j])
					for(int k=0;k<26;k++)
						jia(f[i][g[i][k]&j],f[i-1][j]);
		for(int i=0;i<(1<<n);i++)
		{
			int sm=0;
			for(int j=0;j<n;j++)
				if(i&(1<<j))
					sm++;
			if(sm==m)
				jia(ans,f[len][i]);
		}
		printf("%d\n",ans);
	}
	return 0;
}
bzoj 1879: [Sdoi2009]Bill的挑战【状压dp】的更多相关文章
- BZOJ 1879 [Sdoi2009]Bill的挑战 ——状压DP
		本来打算好好写写SDOI的DP题目,但是忒难了, 太难了,就写的这三道题仿佛是可做的. 生在弱省真是兴奋. 这题目直接状压,f[i][j]表示匹配到i,状态集合为j的方案数,然后递推即可. #incl ... 
- BZOJ.1879.[SDOI2009]Bill的挑战(状压DP)
		题目链接 f定义和下面的思路一样,转移时枚举填什么字符,去更新f并算出有哪些字符串可以匹配某个状态(见code吧...). 预处理出有哪些字符串在第i位可以转移到某个字符c,dp时&一下状态即 ... 
- 【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP
		[BZOJ1879][Sdoi2009]Bill的挑战 Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含 ... 
- BZOJ1879:[SDOI2009]Bill的挑战(状压DP)
		Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. T ≤ ... 
- bzoj 1879: [Sdoi2009]Bill的挑战
		题目链接 bzoj 1879: [Sdoi2009]Bill的挑战 题解 n<=15,装压吧 对所有字符串进行装压 可以预处理一个数组can[i][j]表示所有的字符串中,有哪些可以在第i位匹配 ... 
- bzoj 1879 [Sdoi2009]Bill的挑战(状压DP)
		Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. Output ... 
- 【BZOJ1879】【SDOI2009】Bill的挑战 [状压DP]
		Bill的挑战 Time Limit: 4 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第一行:一个整数T, ... 
- BZOJ 1226 [SDOI2009]学校食堂Dining ——状压DP
		看到B<=8,直接状态压缩即可. dp[i][j][k]表示当前相对位置是关于i的,并且i以前的已经就餐完毕,j表示i和之后的就餐情况,k表示上一个就餐的人的相对位置. 然后Dp即可 #incl ... 
- [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】
		题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ... 
随机推荐
- 第04章-VTK基础(3)
			[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ... 
- angularjs中下拉框select option默认值
			1.问题说明: option ng-repeat多空白项 2.解决方案: html: <ion-view hide-nav-bar="true"> <ion-co ... 
- 走入asp.net mvc不归路:[6]linq常见用法
			asp.net mvc结合linq,先不说性能问题,对于增删查改的操作还是相当方便的.以下我们就来介绍一下linq在asp.net mvc的Controller中的常见用法. 1 首先来看看整个数据表 ... 
- Linux input子系统实例分析(一)
			这是一个简单的输入设备驱动实例.这个输入设备只有一个按键,按键被连接到一条中断线上,当按键被按下时,将产生一个中断,内核将检测到这个中断,并对其进行处理.该实例的代码如下: 1: #inclu ... 
- 跨平台C++:(前言)正确打开C++的方式
			接触C++已经十五年了...但是对于C++而言,我至今是个门外汉,不是谦虚,而是确实不得其门而入. 历程是这样的—— 大学考研要考C++,就自学了.研没考上,C++算是学了,准确的说是C++的语法,以 ... 
- SQL常见问题及解决备忘
			1.mysql中:you cant't specify tartget table for update in from clause 错误 含义:在同一语句中update或delete某张表的时候, ... 
- 为什么java web项目中要使用spring
			1 不使用spring的理由 spring太复杂,不利于调试. spring太复杂,不利于全面掌控代码. spring加载bean太慢. 等等. 2 对不使用spring理由的辩驳 spring io ... 
- gson如何转化json数组
			String.JsonObject.JavaBean 互相转换 User user = new Gson().fromJson(jsonObject, User.class); User user = ... 
- POJ2135 Farm Tour —— 最小费用最大流
			题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submis ... 
- silverlight 图片引入代码
			private void comboBox2_SelectionChanged(object sender, SelectionChangedEventArgs e) { string str = t ... 
