BZOJ.1879.[SDOI2009]Bill的挑战(状压DP)
f定义和下面的思路一样,转移时枚举填什么字符,去更新f并算出有哪些字符串可以匹配某个状态(见code吧...)。
预处理出有哪些字符串在第i位可以转移到某个字符c,dp时&一下状态即可。
以下是错误思路(题意理解错,如果是'?'则无论如何都已匹配且要求恰好K个。。):
f[i][s]表示当前第i位,匹配的字符串为s集合中的字符串,此时的方案数。
枚举长度、s、每个串,而s最多是C(15,7)=6435种,复杂度OK。。
//7996kb 596ms
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define mod (1000003)
const int N=(1<<15)+3,L=55;
int n,K,bit[N],f[L][N],match[L][29];
char s[17][L];
int main()
{
for(int i=1; i<(1<<15); ++i)
for(int j=i; j; j>>=1) bit[i]+=j&1;
int T; scanf("%d",&T);
while(T--)
{
memset(f,0,sizeof f), memset(match,0,sizeof match);
scanf("%d%d",&n,&K);
for(int i=0; i<n; ++i) scanf("%s",s[i]);
int len=strlen(s[0]),lim=1<<n;
for(int i=0; i<len; ++i)
for(int j=0; j<n; ++j)
if(s[j][i]=='?') for(int k=0; k<26; ++k) match[i][k]|=(1<<j);//(1<<j)不是j!
else match[i][s[j][i]-'a']|=(1<<j);//同上.
f[0][lim-1]=1;
for(int i=0; i<len; ++i)
for(int j=0; j<lim; ++j)
if(f[i][j])
for(int k=0; k<26; ++k)//枚举下一位填字符k,这只是一种方案,所以是加不是乘!
(f[i+1][j&match[i][k]]+=f[i][j])%=mod;
int res=0;
for(int i=0; i<lim; ++i)
if(bit[i]==K) (res+=f[len][i])%=mod;
printf("%d\n",res);
}
return 0;
}
BZOJ.1879.[SDOI2009]Bill的挑战(状压DP)的更多相关文章
- BZOJ 1879 [Sdoi2009]Bill的挑战 ——状压DP
本来打算好好写写SDOI的DP题目,但是忒难了, 太难了,就写的这三道题仿佛是可做的. 生在弱省真是兴奋. 这题目直接状压,f[i][j]表示匹配到i,状态集合为j的方案数,然后递推即可. #incl ...
- 【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 ...
- 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 ...
随机推荐
- DNA序列编码中Hairpin的定义和计算
DNA序列编码中Hairpin的定义和计算 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 [1] 张凯. DNA计算核酸编码优化及算法设计[D]. 2008. [2] Shin, ...
- My latest news
2018.04.12 0:01 本站点停止更新,启用0x7c00.vip站点. 2018.03.23 复试报道(心态不太平稳).每一行的深入都是需要知识的积累和时间的沉淀,就像学法律.计算机等等.愿 ...
- 那些年的 网络通信之 UDP 数据报包传输---
下面是 一个多线程,基于 UDP 用户数据报包 协议 的 控制台聊天小程序 import java.io.*; import java.net.*; class Send implements Run ...
- 用Emacs将文件加密保存
为Emacs安装ps-ccrypt插件. 如果你在使用elpa(Emacs的一个插件管理器), 可以M-x list-packages, 从插件列表中找到 ps-ccrypt, 在该项上按i将其标记为 ...
- 20155216 2016-2017-2 《Java程序设计》第八周学习总结
20155216 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 认识NIO Java NIO 由以下几个核心部分组成: Channels Buffers S ...
- Django用ajax进行post请求
post请求有两种,跨域和不跨域 1.不跨域 # 不跨域的 view.py def re_json(request): print(request.POST['name']) p1 = Product ...
- Windows中用“ls”命令
解决办法是: 在C:\Windows\System32目录下新建文本文档,文件内容为: @echo off dir 另存为“ls.bat” 类型为所有文件,编码ANSI 可使用dir 或者ls都可以 ...
- update-rc.d使用
在Linux系统下,一个Services的启动.停止以及重启通常是通过/etc/init.d目录下的脚本来控制的.然而,在启动或改变运行级别时,是在/etc/rcX.d中来搜索脚本.其中X是运行级别的 ...
- 总结WCF开发中遇到的几个问题
最近的项目,需要用到WCF,在以前的工作中,经常是将WCF托管在IIS中,主要有几下几个原因: 第一:部署非常方便,和部署一个站点没什么区别: 第二:不受防火墙的影响,因为一般服务 ...
- .NET C#错误:所生成项目的处理器框架“MSIL”与引用“wdapi_dotnet1021”的处理器架构“AMD64”不匹配
.NET C#错误:所生成项目的处理器框架“MSIL”与引用“wdapi_dotnet1021”的处理器架构“AMD64”不匹配. 直接在项目右键属性->生成->x64. 即可解决