「SDOI2009」Bill的挑战
「SDOI2009」Bill的挑战
传送门
状压 \(\text{DP}\)
瞄一眼数据范围 \(N\le15\),考虑状压。
设 \(f[i][j]\) 表示在所有串中匹配到第 \(i\) 位字符且匹配状态为 \(j\) 的方案数。
以及 \(g[i][c]\) 表示在所有串中匹配至第 \(i\) 位字符且第 \(i\) 位字符为 \(c\) 的合法最大匹配数(状态的数值最大)
那么我们就可以开始愉快地 \(\text{DP}\) 啦。
参考代码:
/*--------------------------------
Code name: C.cpp
Author: The Ace Bee
This code is made by The Ace Bee
--------------------------------*/
#include <cstdio>
#include <cstring>
#define rg register
#define file(x) \
freopen(x".in", "r", stdin); \
freopen(x".out", "w", stdout);
inline int read() {
int s = 0; bool f = false; char c = getchar();
while (c < '0' || c > '9') f |= (c == '-'), c = getchar();
while (c >= '0' && c <= '9') s = (s << 3) + (s << 1) + (c ^ 48), c = getchar();
return f ? -s : s;
}
inline int count(int x) {
int res = 0;
while (x) res += x & 1, x >>= 1;
return res;
}
char s[17][55];
int f[55][1 << 15 | 10], g[55][30];
inline void plus(int& a, int b) { a = (a + b) % 1000003; }
int main() {
// file("C");
for (rg int T = read(); T; --T) {
memset(f, 0, sizeof f);
memset(g, 0, sizeof g);
int n = read(), k = read();
for (rg int i = 1; i <= n; ++i) scanf("%s", s[i]);
int len = strlen(s[1]);
for (rg int i = 0; i < len; ++i)
for (rg char c = 'a'; c <= 'z'; ++c)
for (rg int j = 1; j <= n; ++j)
if (s[j][i] == '?' || s[j][i] == c)
g[i][c - 'a'] |= 1 << (j - 1);
int lmt = (1 << n) - 1;
f[0][lmt] = 1;
for (rg int i = 0; i < len; ++i)
for (rg int j = 0; j <= lmt; ++j)
if (f[i][j])
for (rg char c = 'a'; c <= 'z'; ++c)
plus(f[i + 1][g[i][c - 'a'] & j], f[i][j]);
int ans = 0;
for (rg int i = 0; i <= lmt; ++i)
if (count(i) == k) plus(ans, f[len][i]);
printf("%d\n", ans);
}
return 0;
}
「SDOI2009」Bill的挑战的更多相关文章
- 「SDOI2009」HH的项链
「SDOI2009」HH的项链 传送门 数据加强了,莫队跑不过了. 考虑用树状数组. 先把询问按右端点递增排序. 然后对于每一种贝壳,我们都用它最右一次出现的位置计算答案. 具体细节看代码吧. 参考代 ...
- 【BZOJ1879】【SDOI2009】Bill的挑战 [状压DP]
Bill的挑战 Time Limit: 4 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第一行:一个整数T, ...
- 【SDOI2009】Bill的挑战
Description Sheng bill不仅有惊人的心算能力,还可以轻松地完成各种统计.在昨天的比赛中,你凭借优秀的程序与他打成了平局,这导致Sheng bill极度的不满.于是他再次挑战你.这次 ...
- 「SDOI2009」虔诚的墓主人
传送门 Luogu 解题思路 离散化没什么好说 有一种暴力的想法就是枚举每一个坟墓,用一些数据结构维护一下这个店向左,向右,向上,向下的常青树的个数,然后用组合数统计方案. 但是网格图边长就有 \(1 ...
- 【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的方案数 枚举下一个字符是什么 计算加 ...
- 「WC2016」挑战NPC
「WC2016」挑战NPC 解题思路 这个题建图非常厉害,带花树什么的只会口胡根本写不动,所以我写了机房某大佬教我的乱搞. 考虑把一个筐 \(x\) 拆成 \(x1,x2,x3\) 三个点,且这三个点 ...
- 【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位匹配 ...
随机推荐
- IntelliJ IDEA 2017.3尚硅谷-----取消标题单行显示
- python开发基础作业02:三级菜单,使用字典dic及列表
作业要求及提示:三级菜单 ''' 1.三级菜单 2.可依次进入各子菜单 3.菜单能够回到上一级 4.用到知识点:字典.列表.多层循环.函数 条件:基本 if else 嵌套 if...if... ...
- 优化 : Oracle数据库Where条件执行顺序 及Where子句的条件顺序对性能的影响
.Oracle数据库Where条件执行顺序: 由于SQL优化起来比较复杂,并且还会受环境限制,在开发过程中,写SQL必须必须要遵循以下几点的原则: 1.ORACLE采用自下而上的顺序解析WHERE子句 ...
- X86现代汇编·02
下面4这个寄存器只能用16位或3N位名称访问3N位寄存器 :ESI EDI EBP ESP 16位寄存器: SI DI BP SP 特殊用法:乘除指令默认用EAX默认使用ECX为循环计数器ESP用于寻 ...
- (搬运)使用PHPstudy在Windows服务器下部署PHP系统
原帖地址:http://www.php.cn/php-weizijiaocheng-406175.html 这篇文章主要介绍了关于使用PHPstudy在Windows服务器下部署PHP系统,有着一定的 ...
- 【原】接口mock作用
1.前后端 接口定义完成 并发开工 2.测试拿到mock接口 编写用例 3.mock接口 模拟异常服务器返回值 500 404 4.mock接口 模拟数据 不修改线上数据库
- Linux centos7 shell 介绍、 命令历史、命令补全和别名、通配符、输入输出重定向
一.shell介绍 shell脚本是日常Linux系统管理工作中必不可少的,不会shell,就不是一个合格管理员. shell是系统跟计算机硬件交互使用的中间介质,一个系统工具.实际上在shell和计 ...
- centos7的netca命令和netmgr命令、dbca命令等基础知识点
netca命令: netmgr命令: dbca命令: database assistant configuration 中的SGA 和PGA SGA:System Global Area是Oracl ...
- office自签名证书
在 Office安装目录,找到 SELFCERT 文件,双击打开填写名称,生成
- ClickOnce部署,修改deploymentProvider
打开 以.application 为后缀的文件,找到并修改 <deploymentProvider codebase="" /> 即可