Description

  Sheng bill不仅有惊人的心算能力,还可以轻松地完成各种统计。在昨天的比赛中,你凭借优秀的程序与他打成了平局,这导致Sheng bill极度的不满。于是他再次挑战你。这次你可不能输!
  这次,比赛规则是这样的:
  给N个长度相同的字符串(由小写英文字母和‘?’组成),S1,S2,...,SN,求与这N个串中的刚好K个串匹配的字符串T的个数(答案模1000003)。
  若字符串Sx(1≤x≤N)和T匹配,满足以下条件:
  1. Sx.length = T.length。
  2.对于任意的1≤i≤Sx.length,满足Sx[i]=?或者Sx[i]=T[i]。
  其中T只包含小写英文字母。

Input

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

Output

对于每组数据,输出方案数目(共T行)。

Sample Input

5

3 3

???r???

???????

???????

3 4

???????

?????a?

???????

3 3

???????

?a??j??

????aa?

3 2

a??????

???????

???????

3 2

???????

???a???

????a??

Sample Output

914852

0

0

871234

67018

Hint

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

比较套路的容斥。我们设g[i]表示至少匹配了i个字符串的子串个数。f[i]表示g[i]的容斥系数。

处理n个字符串,刚好匹配了m的字符串的问题时,我们设。对于i>m,

然后就dfs枚举字符串的集合,显然一个集合的答案就是这个集合中的字符串的的交集中的“?”个数。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#define ll long long
#define mod 1000003 using namespace std;
inline int Get() {int x=,f=;char ch=getchar();while(ch<''||ch>'') {if(ch=='-') f=-;ch=getchar();}while(''<=ch&&ch<='') {x=(x<<)+(x<<)+ch-'';ch=getchar();}return x*f;} int T;
int n,m,len;
char s[][];
ll ans,f[],c[][];
ll ksm(ll t,ll x) {
ll ans=;
for(;x;x>>=,t=t*t%mod)
if(x&) ans=ans*t%mod;
return ans;
}
void dfs(int v,int tot,char t[]) {
if(v>n) {
if(tot<m) return ;
int cnt=;
for(int i=;i<=len;i++) if(t[i]=='?') cnt++;
ans=(ans+f[tot]*ksm(,cnt)%mod)%mod;
return ;
}
dfs(v+,tot,t);
char tem[];
for(int i=;i<=len;i++) {
if(t[i]=='?') {
tem[i]=s[v][i];
} else if(s[v][i]=='?') tem[i]=t[i];
else if(s[v][i]!=t[i]) return ;
}
dfs(v+,tot+,tem);
}
int main() {
c[][]=;
for(int i=;i<=;i++)
for(int j=;j<=i;j++)
c[i][j]=(!j||j==i)?:(c[i-][j-]+c[i-][j])%mod;
T=Get();
while(T--) {
n=Get(),m=Get();
if(n<m) {cout<<<<"\n";continue ;}
memset(f,,sizeof(f));
f[m]=;
for(int i=m+;i<=n;i++) {
for(int j=m;j<i;j++) {
f[i]=(f[i]-f[j]*c[i][j]%mod+mod)%mod;
}
}
for(int i=;i<=n;i++) scanf("%s",s[i]+);
len=strlen(s[]+);
char tem[];
for(int i=;i<=len;i++) tem[i]='?';
ans=;
dfs(,,tem);
cout<<ans<<"\n";
}
return ;
}

【SDOI2009】Bill的挑战的更多相关文章

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

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

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

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

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

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

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

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

  5. [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp

    Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...

  6. [LuoguP2167][SDOI2009]Bill的挑战_容斥原理/状压dp

    Bill的挑战 题目链接:https://www.luogu.org/problem/P2167 数据范围:略. 题解: 因为$k$特别小,想到状压. 状压的方式也非常简单,就是暴力枚举. 但是会不会 ...

  7. bzoj 1879 [Sdoi2009]Bill的挑战(状压DP)

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

  8. [SDOI2009]Bill的挑战

    题目描述 题解: 因为要求的T长度一定,可定义f[i][j] 为前i位状态为j的方案,can[i][j]表示第i为字母j,可行的状态 每次往后推就行了 #include <algorithm&g ...

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

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

  10. BZOJ.1879.[SDOI2009]Bill的挑战(状压DP)

    题目链接 f定义和下面的思路一样,转移时枚举填什么字符,去更新f并算出有哪些字符串可以匹配某个状态(见code吧...). 预处理出有哪些字符串在第i位可以转移到某个字符c,dp时&一下状态即 ...

随机推荐

  1. Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具

    Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具 介绍 该工具是通过一个github上的开源项目修改的原始作者https://github.com/Supere ...

  2. JavaScript跨域解决方式

    平时工作中经常被JavaScript跨域问题所困扰,其实有很多种解决方式,下面给大家介绍常用的几种: 1.jsonp解决跨域问题 客户端代码: <!DOCTYPE html> <ht ...

  3. [JZOJ5837] Omeed

    Description Solution 有两种做法 一种是线段树维护一次方程系数,一种是线段树维护矩阵 准备都写一写 维护系数 首先把式子推出来 \[CS=B\times \sum\limits_{ ...

  4. 多啦爱梦~多啦A梦CSS3测试源代码

    先直接看图片,感觉一下!一直以来,我们都在说浏览器对CSS3支持度这个问题.可是,鉴于知识认识水平问题,又没几个人真正了解CSS3是什么东西,和它在网站显示上的重要性.现在好了,日本某位大神写了个CS ...

  5. C# 取得上月月头和月尾、上周的第一天和最后一天。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. objectLiteral.js

    // 1.任意参数的加法运算 function add(){ var sum = 0 for(var i=0;i<arguments.length;i++){ if(!isNaN(argumen ...

  7. HTML的head标签

    前端开发工具介绍: Hbuilder:可以快速的生成HTML标准文档结构,集成了很多方便的快捷键.--------------------------------------------------- ...

  8. flex 布局下,css 设置文本不换行时,省略号不显示的解决办法

    大致是有一个 main 容器是 flex 布局,左边一个 logo 固定宽高,右边 content 动态宽度. <div class="main"> <img a ...

  9. layer.open

    1.type-基本层类型 类型:Number,默认:0 layer提供了5种层类型.可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层). 若你采用layer. ...

  10. excel单元格内换行的方法

    方法一:调整单元格格式换行 选定单元格,选择“格式→单元格”,在弹出的对话框中单击“对齐”,选中“自动换行”,单击[确定]按钮即可. 方法二:Alt+Enter键(使用强行换行时,系统会同时选择自动换 ...