当前位置: 首页 > news >正文

【SDOI2009】Bill的挑战

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的字符串的问题时,我们设f[i]=0(0\leqslant i<m),f[m]=1。对于i>m,f[i]=-\sum _{0\leqslant j <i}f[j]\cdot \binom{i}{j}

然后就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=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}

int T;
int n,m,len;
char s[16][55];
ll ans,f[20],c[20][20];
ll ksm(ll t,ll x) {
    ll ans=1;
    for(;x;x>>=1,t=t*t%mod)
        if(x&1) ans=ans*t%mod;
    return ans;
}
void dfs(int v,int tot,char t[]) {
    if(v>n) {
        if(tot<m) return ;
        int cnt=0;
        for(int i=1;i<=len;i++) if(t[i]=='?') cnt++;
        ans=(ans+f[tot]*ksm(26,cnt)%mod)%mod;
        return ;
    }
    dfs(v+1,tot,t);
    char tem[55];
    for(int i=1;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+1,tot+1,tem);
}
int main() {
    c[0][0]=1;
    for(int i=1;i<=15;i++)
        for(int j=0;j<=i;j++)
            c[i][j]=(!j||j==i)?1:(c[i-1][j-1]+c[i-1][j])%mod;
    T=Get();
    while(T--) {
        n=Get(),m=Get();
        if(n<m) {cout<<0<<"\n";continue ;}
        memset(f,0,sizeof(f));
        f[m]=1;
        for(int i=m+1;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=1;i<=n;i++) scanf("%s",s[i]+1);
        len=strlen(s[1]+1);
        char tem[55];
        for(int i=1;i<=len;i++) tem[i]='?';
        ans=0;
        dfs(1,0,tem);
        cout<<ans<<"\n";
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/hchhch233/p/9735808.html

相关文章:

  • java与C#的简单比较
  • 关于malloc的一个未解决的疑问
  • ASP.NET Core 基本项目目录结构 - ASP.NET Core 基础教程 - 简单教程,简单编程
  • 配置Windows2008R2桌面体验
  • Proxmox-VE搭配Ceph存储组建高可用虚拟化平台
  • jeetsite 4.0 框架搭建入门
  • 微信5.0绑定银行卡教程
  • python第三周:集合、函数、编码、文件
  • .sh 的运行
  • jQuery(四):HTML代码操作
  • SVN使用教程之-分支/标记 合并 subeclipse
  • leetcode341
  • Java编译时出现的一个编译错误
  • citus实战系列之四多CN部署
  • mysqlbinlog恢复数据-update20140820
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 收藏网友的 源程序下载网
  • 【前端学习】-粗谈选择器
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular数据绑定机制
  • JAVA并发编程--1.基础概念
  • Netty 4.1 源代码学习:线程模型
  • rc-form之最单纯情况
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • React系列之 Redux 架构模式
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Spark RDD学习: aggregate函数
  • sublime配置文件
  • tensorflow学习笔记3——MNIST应用篇
  • windows下mongoDB的环境配置
  • windows下如何用phpstorm同步测试服务器
  • 从setTimeout-setInterval看JS线程
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 对JS继承的一点思考
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 将回调地狱按在地上摩擦的Promise
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​一些不规范的GTID使用场景
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (BFS)hdoj2377-Bus Pass
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (四)Android布局类型(线性布局LinearLayout)
  • (算法)求1到1亿间的质数或素数
  • (五)Python 垃圾回收机制
  • (转)ABI是什么
  • .net 程序发生了一个不可捕获的异常
  • .net操作Excel出错解决
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net生成的类,跨工程调用显示注释
  • @Autowired自动装配
  • @ModelAttribute注解使用
  • @SentinelResource详解