「SDOI2009」Bill的挑战

传送门

状压 \(\text{DP}\)

瞄一眼数据范围 \(N\le15\),考虑状压。

设 \(f[i][j]\) 表示在所有串中匹配到第 \(i\) 位字符且匹配状态为 \(j\) 的方案数。

以及 \(g[i][c]\) 表示在所有串中匹配至第 \(i\) 位字符且第 \(i\) 位字符为 \(c\) 的合法最大匹配数(状态的数值最大)

那么我们就可以开始愉快地 \(\text{DP}\) 啦。

参考代码:

  1. /*--------------------------------
  2. Code name: C.cpp
  3. Author: The Ace Bee
  4. This code is made by The Ace Bee
  5. --------------------------------*/
  6. #include <cstdio>
  7. #include <cstring>
  8. #define rg register
  9. #define file(x) \
  10. freopen(x".in", "r", stdin); \
  11. freopen(x".out", "w", stdout);
  12. inline int read() {
  13. int s = 0; bool f = false; char c = getchar();
  14. while (c < '0' || c > '9') f |= (c == '-'), c = getchar();
  15. while (c >= '0' && c <= '9') s = (s << 3) + (s << 1) + (c ^ 48), c = getchar();
  16. return f ? -s : s;
  17. }
  18. inline int count(int x) {
  19. int res = 0;
  20. while (x) res += x & 1, x >>= 1;
  21. return res;
  22. }
  23. char s[17][55];
  24. int f[55][1 << 15 | 10], g[55][30];
  25. inline void plus(int& a, int b) { a = (a + b) % 1000003; }
  26. int main() {
  27. // file("C");
  28. for (rg int T = read(); T; --T) {
  29. memset(f, 0, sizeof f);
  30. memset(g, 0, sizeof g);
  31. int n = read(), k = read();
  32. for (rg int i = 1; i <= n; ++i) scanf("%s", s[i]);
  33. int len = strlen(s[1]);
  34. for (rg int i = 0; i < len; ++i)
  35. for (rg char c = 'a'; c <= 'z'; ++c)
  36. for (rg int j = 1; j <= n; ++j)
  37. if (s[j][i] == '?' || s[j][i] == c)
  38. g[i][c - 'a'] |= 1 << (j - 1);
  39. int lmt = (1 << n) - 1;
  40. f[0][lmt] = 1;
  41. for (rg int i = 0; i < len; ++i)
  42. for (rg int j = 0; j <= lmt; ++j)
  43. if (f[i][j])
  44. for (rg char c = 'a'; c <= 'z'; ++c)
  45. plus(f[i + 1][g[i][c - 'a'] & j], f[i][j]);
  46. int ans = 0;
  47. for (rg int i = 0; i <= lmt; ++i)
  48. if (count(i) == k) plus(ans, f[len][i]);
  49. printf("%d\n", ans);
  50. }
  51. return 0;
  52. }

「SDOI2009」Bill的挑战的更多相关文章

  1. 「SDOI2009」HH的项链

    「SDOI2009」HH的项链 传送门 数据加强了,莫队跑不过了. 考虑用树状数组. 先把询问按右端点递增排序. 然后对于每一种贝壳,我们都用它最右一次出现的位置计算答案. 具体细节看代码吧. 参考代 ...

  2. 【BZOJ1879】【SDOI2009】Bill的挑战 [状压DP]

    Bill的挑战 Time Limit: 4 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第一行:一个整数T, ...

  3. 【SDOI2009】Bill的挑战

    Description Sheng bill不仅有惊人的心算能力,还可以轻松地完成各种统计.在昨天的比赛中,你凭借优秀的程序与他打成了平局,这导致Sheng bill极度的不满.于是他再次挑战你.这次 ...

  4. 「SDOI2009」虔诚的墓主人

    传送门 Luogu 解题思路 离散化没什么好说 有一种暴力的想法就是枚举每一个坟墓,用一些数据结构维护一下这个店向左,向右,向上,向下的常青树的个数,然后用组合数统计方案. 但是网格图边长就有 \(1 ...

  5. 【BZOJ1879】[SDOI2009]Bill的挑战(动态规划)

    [BZOJ1879][SDOI2009]Bill的挑战(动态规划) 题面 BZOJ 洛谷 题解 本来还想着容斥来着,这个数据范围直接暴力就好.设\(f[i][S]\)表示当前填到了第\(i\)位,和\ ...

  6. bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战

    http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...

  7. 「WC2016」挑战NPC

    「WC2016」挑战NPC 解题思路 这个题建图非常厉害,带花树什么的只会口胡根本写不动,所以我写了机房某大佬教我的乱搞. 考虑把一个筐 \(x\) 拆成 \(x1,x2,x3\) 三个点,且这三个点 ...

  8. 【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP

    [BZOJ1879][Sdoi2009]Bill的挑战 Description Input 本题包含多组数据.  第一行:一个整数T,表示数据的个数.  对于每组数据:  第一行:两个整数,N和K(含 ...

  9. bzoj 1879: [Sdoi2009]Bill的挑战

    题目链接 bzoj 1879: [Sdoi2009]Bill的挑战 题解 n<=15,装压吧 对所有字符串进行装压 可以预处理一个数组can[i][j]表示所有的字符串中,有哪些可以在第i位匹配 ...

随机推荐

  1. 如何在linux安装ruby2.2.2+

    背景: 想搭建redis集群但是提示需要ruby2.2.2+ 直接使用yum安装 yum -y install ruby ruby-devel rubygems rpm-build 使用ruby -v ...

  2. 使用pip安装速度慢问题的解决

    参考博客:https://blog.csdn.net/u011580175/article/details/82292424 解决方案所以,在使用pip时,可以指定使用国内的下载源这样下载速度会快很多 ...

  3. 微信小程序UDP通信

    前言 UDP通信分为单播 广播 组播,基础库2.7.0之后,小程序开始支持UDP通信,目前小程序只支持单播. 小程序API 小程序UDP通信这一块可以说是很简单了就一个UDPSocket实例.然后bi ...

  4. find 报错 find: paths must precede expression:

    编写shell脚本,报错,如下面 [root@localhost backup]#find ./ -name mysqldump* -mtime +3 -delete [root@localhost ...

  5. 【常见浏览器的UA】

    "所谓 UA(User Agent / 用户代理),最初是指浏览器告知网站管理员,本浏览器支持的类型和框架,让网站管理员以支持的模式结构向浏览器发送页面,呈现给用户浏览.演变到今天,网站管理 ...

  6. hadoop学习笔记(五)hadoop伪分布式集群的搭建

    本文原创,如需转载,请注明作者和原文链接 1.集群搭建的前期准备   见      搭建分布式hadoop环境的前期准备---需要检查的几个点 2.解压tar.gz包 [root@node01 ~]# ...

  7. 题解 P1717 【钓鱼】

    P1717 钓鱼 贪心+堆的方法其他题解已经讲的很清楚了,这里放出萌新简洁的dp做法,如果有正确性问题希望大佬能够指出qwq #include<cstdio> using namespac ...

  8. 获得APP的包名package和activity

    方法一: Aapt dumpbadging xxxx.apk(包的路径) 第一个框为包名 第二个框为主Activity名 方法二: 如果你装了Appium 可以这么操作下 进入设置页,选择APK  路 ...

  9. Codeforces AIM Tech Round 5 (rated, Div. 1 + Div. 2)

    A. Find Square time limit per test: 1 second memory limit per test: 256 megabytes input: standard in ...

  10. 干货 | C#开发的电影售票系统

    01 介绍 一个有会员制的电影院购票系统.具有会员注册功能,可区分会员和散客两种身份,实现会员及折扣管理.购票具有挑选电影场次,选择座位和查看电影信息等功能. 查看电影详情.获取排片信息. 选择场次座 ...