题目描述

输入输出格式

输入格式:

本题包含多组数据。 第一行:一个整数T,表示数据的个数。 对于每组数据: 第一行:两个整数,N和K(含义如题目表述)。 接下来N行:每行一个字符串。

输出格式:

1 2 1 a? ?b

输入输出样例

输入样例#1:

50

输出样例#1:

对于30%的数据,T ≤ 5,M ≤ 5,字符串长度≤ 20;对于70%的数据,T ≤ 5,M ≤ 13,字符串长度≤ 30;对于100%的数据,T ≤ 5,M ≤ 15,字符串长度≤ 50。

真是玄学题经历了从50分到70分再到AC一开始看到觉得是带通配符的AC自动机状压DP,一看要求长度都一样,好像直接DP就行呀?然后写了最朴素的DP,dp[i][j]表示转移到第i个字符,目前能匹配上的状态为j的方案数,然后枚举下一位是什么,与所有字符串进行比较转移即可这样的复杂度是  $ O(26TLn*2^n) $  ,能有50分然后可以发现与所有字符串比较是很愚蠢的,进行了很多重复计算,我们可以预处理出每一位所有字符串匹配某个字符的结果,压在一个int里,转移时直接按位与即可这样复杂度是  $ O(26TL*2^n) $  ,能有70分然后你把它数字带进去发现,它乘出来是26*5*50*2^15约等于2e8,这是什么意思?这意思就是稍微卡一卡就能过了。DP怎么稍微卡一卡呢?你想DP倒过来就是记忆化搜索,搜索可以剪枝啊,于是我们尝试剪一剪枝。怎么剪枝呢?加上如果在遍历到某个状态dp[i][j]时,如果dp[i][j]==0就不转移事实上这个效果好得出奇,速度快了10倍都不止,至此获得100分
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <string>
 6 #include <cstring>
 7 #include <cmath>
 8 #include <map>
 9 #include <stack>
10 #include <set>
11 #include <vector>
12 #include <queue>
13 #include <time.h>
14 #define eps 1e-7
15 #define INF 0x3f3f3f3f
16 #define MOD 1000003
17 #define rep0(j,n) for(int j=0;j<n;++j)
18 #define rep1(j,n) for(int j=1;j<=n;++j)
19 #define pb push_back
20 #define set0(n) memset(n,0,sizeof(n))
21 #define ll long long
22 #define ull unsigned long long
23 #define iter(i,v) for(edge *i=head[v];i;i=i->nxt)
24 #define max(a,b) (a>b?a:b)
25 #define min(a,b) (a<b?a:b)
26 #define print_runtime printf("Running time:%.3lfs\n",double(clock())/1000.0)
27 #define TO(j) printf(#j": %d\n",j);
28 //#define OJ
29 using namespace std;
30 const int MAXINT = 100010;
31 const int MAXNODE = 100010;
32 const int MAXEDGE = 2*MAXNODE;
33 char BUF,*buf;
34 int read(){
35     char c=getchar();int f=1,x=0;
36     while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
37     while(isdigit(c)){x=x*10+c-'0';c=getchar();}
38     return f*x;
39 }
40 char get_ch(){
41     char c=getchar();
42     while(!isalpha(c)) c=getchar();
43     return c;
44 }
45 //------------------- Head Files ----------------------//
46
47 int dp[51][1<<15],n,k,l,cnt[1<<15];
48 unsigned int val[51][26];
49 char s[15][60];
50 void get_input();
51 void work();
52 int main() {
53     int T=read();
54     rep1(i,(1<<15)-1){
55         cnt[i]=cnt[i-(i&-i)]+1;
56     }
57     while(T--){
58         get_input();
59         work();
60     }
61     return 0;
62 }
63 void work(){
64     int mx = (1<<n);
65     memset(val,0xffff,sizeof(val));
66     rep1(i,l){
67         rep0(j,26){
68             rep0(k,n){
69                 if(s[k][i]!='?'&&s[k][i]!='a'+j) val[i][j]&=(~(1<<k));
70             }
71         }
72     }
73     dp[0][(1<<n)-1] = 1;
74     rep0(i,l){
75         rep0(j,mx){
76             if(dp[i][j]==0) continue;
77             rep0(k,26){
78                 int t = j;
79                 t&=val[i+1][k];
80                 dp[i+1][t]+=dp[i][j];
81                 dp[i+1][t]%=MOD;
82             }
83         }
84     }
85     ll ans = 0;
86     rep0(i,mx) if(cnt[i]==k) ans+=dp[l][i];
87     printf("%lld\n",ans%MOD);
88 }
89 void get_input(){
90     memset(dp,0,sizeof(dp));
91     n=read();k=read();
92     rep0(i,n) scanf("%s",s[i]+1);
93     l=strlen(s[0]+1);
94 }

 

转载于:https://www.cnblogs.com/LoveYayoi/p/6932869.html

洛谷 P2167 [SDOI2009]Bill的挑战相关推荐

  1. P2167 [SDOI2009]Bill的挑战

    P2167 [SDOI2009]Bill的挑战 题意: 有n个长度一样的字符串,字符串的每一位是?或者确定的字母,,求与这 N 个串中的刚好 K 个串匹配的字符串 T 的个数 1<=N<= ...

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

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

  3. [SDOI2009]Bill的挑战——全网唯一 一篇容斥题解

    全网唯一一篇容斥题解 Description Solution 看到这个题,大部分人想的是状压dp 但是我是个蒟蒻没想到,就用容斥切掉了. 并且复杂度比一般状压低, (其实这个容斥的算法,提出来源于y ...

  4. 洛谷-2151 [SDOI2009]HH去散步

    题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢 ...

  5. 洛谷P2151 [SDOI2009]HH去散步

    Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因 ...

  6. 矩阵——洛谷P2151 [SDOI2009]HH去散步

    https://daniu.luogu.org/problem/show?pid=2151#sub 题目就是说我们不可以回走: 但是环还是可以的: 如果上次1->3 现在不可以直接3->1 ...

  7. 2018.12.5【WC2017】【LOJ2286】【洛谷P4604】挑战(卡常)

    洛谷传送门 LOJ传送门 解析: 目前LOJ速度rank1.但是洛谷上面有两个40msAC的在我前面(空间还小的出奇,估计连排序的数组都存不下)...估计是面向数据编程.. 说明:博主是一个高一OIE ...

  8. 闲来无事刷水题、简单博弈论专题、sg函数、洛谷

    记 今天闲来无事,不想刷codeforces了,到洛谷提高组训练营找几道水题刷着玩玩(虽然自己早已过了打OI的年纪)- 简单博弈论专题 P1199 三国游戏 这么考虑,由于电脑总是不能让我搭配出当前能 ...

  9. 【OJ】洛谷试炼场の新手村整合(Java语言描述)

    Pass 最近通关了洛谷试炼场新手村Part,做了很多的红题和橙题,这里做一下整理吧,希望对需要的人有所帮助. 说明 这些内容确实不是什么复杂的东西,所以无需多言. 洛谷的第一个任务 这里是我写的所有 ...

最新文章

  1. mysql一个索引占用G_mysql 索引 使用注意细节
  2. Centos 7 安装 Haproxy
  3. Windows 10:开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用 的解决方法
  4. sqlite数据库android使用教程,Android开发教程之 SQLite数据库的使用
  5. 遗传算法(GA)中的编码方式-二进制编码、格雷编码、实数编码
  6. Android开发系列(三)
  7. Go 语言:我那么值钱,我骄傲了吗?
  8. c语言枚举入门,C语言入门之枚举与位运算(1)
  9. c语言interrupt函数,中断处理函数数组interrupt[]初始化
  10. Python数据类型解析(基础篇)
  11. 纯CSS的方法解决文字溢出与截断的问题
  12. Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案
  13. Project Euler 628: Open chess positions(公式)
  14. 80072745 80072efd 解决办法
  15. Restful API设计规范及实战
  16. 基于Select模型的匿名聊天室v1.0
  17. Java 9:“拼图计划终于给了我们急需的Java安全带”
  18. 管理经济学 知识点总结(一)
  19. 移动硬盘不能识别的常见7种解决方案 ~ By 逆天经验
  20. html颜色趋势,跟上色彩潮流!带你展望2015年的网页设计配色趋势

热门文章

  1. systemtap原理及使用
  2. lucene3.0中使用MultiFieldQueryParser多字段查找
  3. 提前还贷的python计算程序
  4. 【Java】Java 8 新特性-----Lambda 表达式
  5. IDEA设置注释配置时获取不到参数的解决办法
  6. python基础之元组定义进阶操作、字典定义进阶操作
  7. js 操作java对象_js对象复制
  8. 02-05 Python库-time datetime
  9. 计算机句法分析的研究现状,计算机理论论文融合语义和句型信息的中文句法分析方法研究与实现...
  10. java long类型判断_Java中的long类型和Long类型比较大小