bzoj 1879 [Sdoi2009]Bill的挑战(状压DP)
Description 
Input
本题包含多组数据。 第一行:一个整数T,表示数据的个数。 对于每组数据: 第一行:两个整数,N和K(含义如题目表述)。 接下来N行:每行一个字符串。
Output
1 2 1 a? ?b
Sample Input
50
Sample Output
对于30%的数据,T ≤ 5,M ≤ 5,字符串长度≤ 20;
对于70%的数据,T ≤ 5,M ≤ 13,字符串长度≤ 30;
对于100%的数据,T ≤ 5,M ≤ 15,字符串长度≤ 50。
【思路】
状压DP
设f[i][s]表示前i-1个已经匹配,且匹配集合为s时的方案数。预处理出g[i][j]表示长度为i-1且最后一个字符为j的字符串集合。则有转移方程如下:
f[i+1][s&g[i][k]]+=f[i][j]
【代码】
#include<cstdio>
#include<cstring>
using namespace std; const int N = , M = ;
const int MOD = 1e6+; int f[M][<<N],g[M][];
char s[N][M]; int T,n,K,len; int main() {
scanf("%d",&T);
while(T--) {
memset(f,,sizeof(f));
memset(g,,sizeof(g));
scanf("%d%d",&n,&K);
for(int i=;i<n;i++)
scanf("%s",s[i]);
len=strlen(s[]);
for(int i=;i<len;i++)
for(int j=;j<n;j++) {
if(s[j][i]!='?')
g[i][s[j][i]-'a']^=(<<j);
else
for(int k=;k<;k++)
g[i][k]^=(<<j);
}
int all=<<n; f[][all-]=;
for(int i=;i<len;i++)
for(int j=;j<all;j++) if(f[i][j])
for(int k=;k<;k++)
f[i+][j&g[i][k]]=(f[i+][j&g[i][k]]+f[i][j])%MOD;
int ans=,cnt;
for(int j=;j<all;j++) {
cnt=;
for(int i=;i<n;i++)
if(j&(<<i)) cnt++;
if(cnt==K) ans=(ans+f[len][j])%MOD;
}
printf("%d\n",ans);
}
return ;
}
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】
石乐志写容斥--其实状压dp就行 设f[i][s]表示前i个字母,匹配状态为s,预处理g[i][j]为第i个字母是j的1~n的集合,转移的时候枚举26个字母转移,最后答案加上正好有k个的方案即可 #i ...
- 【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 ...
随机推荐
- (转载)SQL中导入图片
SQL中导入图片 分类: 论坛精贴 2006-05-10 12:07 398人阅读 评论(0) 收藏 举报 sqlimage服务器insertlogingo 1.建立过程CREATE PROCEDUR ...
- 如何读懂Oracle文档中的语法图(转)
本文转载自:http://kyle.xlau.org/posts/syntax-diagrams.html Oracle文档中用到了两种表达语法的方法,语法图和BNF. BNF, Backus-Nau ...
- sscanf用法简析
1. 常见用法. char buf[512] = ; sscanf("123456 ", "%s", buf); printf("%s\n" ...
- MVC-登录并设置角色
1.新建一个类,设置角色: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- 微软职位内部推荐-ATG Engineer II
微软近期Open的职位: ATG Engineer - GeneralistReady to work on some of the most advanced hardware on the pla ...
- CoreBluetooth - TouchID应用
支持系统和机型: iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8, 虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论 ...
- objective-c常用数学方法
1. 三角函数 double sin (double);正弦 double cos (double);余弦 double tan (double);正切 2 .反三角函数 double as ...
- android 在Fragment里添加Theme主题
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanc ...
- 使用Eclipse调试Android Native Application---cocos2d-x + Eclipse + Android + ndk
纠结很多天的ndk 调试, 终于在 mac 下面顺利完成(注意在windows还是没弄成功,蛋疼...) 调试方法: 1:先google, ndk demo . 把ndk 最基本的hellword ...
- HTTP Header 入门详解
什么是HTTP Headers HTTP是"Hypertext Transfer Protocol"的所写,整个www都在使用这种协定,几乎你在流览器里看到的大部分内容都是通过ht ...