博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2167 [SDOI2009]Bill的挑战
阅读量:7249 次
发布时间:2019-06-29

本文共 1298 字,大约阅读时间需要 4 分钟。

题目描述

输入输出格式

输入格式:

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

输出格式:

如题

输入输出样例

输入样例#1:
53 3???r?????????????????3 4????????????a????????3 3????????a??j??????aa?3 2a????????????????????3 2??????????a???????a??
输出样例#1:
9148520087123467018

说明

对于30%的数据,T ≤ 5,M ≤ 5,字符串长度≤ 20;

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

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

 

题解:

  不知道为什么被我水过了,设dp[i][S]表示当前正在dp第i位,S表示有哪些串已经不合法了(合法为1,不合法为0),转移的话枚举一个字母,然后填上去,判断一下现在有那些串不合法就可以了。

  状态有50*2^15个,转移是15*26的,这样子都可以水过去,本来想先写一个,优化一下的……

 

代码:

  

// luogu-judger-enable-o2#include 
#include
#include
#include
#include
#include
#define RG register#define mod 1000003#define ll long longusing namespace std;char a[100][100];ll dp[52][(1<<17)+1];int n,K,len;int getnum(int S){ int num=0; while(S!=0){ if(S%2==1) num++; S/=2; } return num;}void work(){ cin>>n>>K; for(int i=1;i<=n;i++) scanf("%s",a[i]+1); len=strlen(a[1]+1); memset(dp,0,sizeof(dp)); dp[1][(1<
0;S--){ if(dp[i][S]!=0){ if(getnum(S)
0;S--){ if(getnum(S)==K) ans+=dp[len+1][S],ans%=mod; } printf("%lld\n",ans);}int main(){ int t;cin>>t; while(t--) work(); return 0;}

 

转载于:https://www.cnblogs.com/renjianshige/p/9489363.html

你可能感兴趣的文章
一入前端深似海,从此红尘是路人系列第四弹之未来前端路该何去何从
查看>>
java笔记--笔试中极容易出错的表达式的陷阱
查看>>
第140天:前端开发中浏览器兼容性问题总结(一)
查看>>
socket编程的select模型
查看>>
智能医疗的春天在哪里?
查看>>
Kali Linux 无线渗透测试入门指南 第二章 WLAN 和固有的不安全性
查看>>
MyExcel 2.1.2 版本发布,重要 Bug 修复
查看>>
广汽与蔚来达成合作,将共同投资12.8亿元创立新能源汽车公司
查看>>
量子力学,整合了三种自然相互作用力
查看>>
亚马逊新专利,让无人机运送充电器为电动车充电
查看>>
HTC将Viveport推向全球,这是要“反击”Valve的节奏?
查看>>
【深度学习不是犯罪】欧盟祭出最严数据保护法:专家解读 GDPR
查看>>
浅谈SQL Server 对于内存的管理
查看>>
喜报销发布V2.4,圣诞焕新装,新增“专项费用报销”审批,集成京东商城
查看>>
陈天奇团队新研究:自动优化深度学习工作负载
查看>>
你的无人机快递来了?小心被查“水表”
查看>>
收录 Uboot 详解
查看>>
MongoDB数据库的索引操作(转)
查看>>
线程的实现
查看>>
重建日志文件
查看>>