BZOJ1879 Bill的挑战
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1879
本来是一道水题(~~~~(>_<)~~~~)。
开始SB了,敲了个AC自动机dp,MLE
发现数据中 '?' 好多呀 ~~~~(>_<)~~~~ 空间变$O(len^2)$
然后去想朴素dp,枚举一下那些集合和T匹配,然后$O(n \cdot 2^n)$ dp,又W又T一是爽。
TLE 40:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector> #define c(w,i) ((w>>i)&1)
#define mod 1000003
#define LL long long
#define MP(x,y) make_pair(x,y)
#define fir first
#define sec second using namespace std; int n,K,cnt;
char S[][],T[];
LL f[][];
vector<pair<int,char> > v[]; LL calc(int w){
for(int i=;i<n;i++) T[i]='?';
for(int i=;i<cnt;i++)
if(c(w,i)){
for(int j=;j<n;j++)
if(S[i][j]!='?'){
if(T[j]=='?'||T[j]==S[i][j])
T[j]=S[i][j];
else return ;
}
}
memset(f,,sizeof(f));
for(int i=,fl;i<cnt;i++)
if(!c(w,i)){
fl=;
for(int j=;j<n;j++){
if(S[i][j]!='?' && T[j]!='?' && S[i][j]!=T[j])
fl=;
}
if(!fl){
for(int j=;j<n;j++){
if(S[i][j]!='?')
v[j].push_back(MP(i,S[i][j]));
}
}
}
f[][]=;
for(int i=;i<n;i++){
for(int w=;w<(<<cnt);w++)
if(f[i][w]){
for(char c='a';c<='z';c++){
if(T[i]!='?'&&T[i]!=c) continue;
int now=;
for(int j=v[i].size()-;~j;j--)
if(v[i][j].sec!=c) now|=(<<v[i][j].fir);
f[i+][now|w]+=f[i][w];
}
}
}
return f[n][((<<cnt)-)&~w];
} int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&cnt,&K);
for(int i=;i<cnt;i++) scanf("%s",S[i]);
n=strlen(S[]);
LL ans=;
for(int w=;w<(<<cnt);w++){
int tmp=;
for(int i=;i<cnt;i++)
if(c(w,i)) tmp++;
if(tmp!=K) continue;
ans=(ans+calc(w))%mod;
}
printf("%lld\n",ans);
}
return ;
}
然后发现我是SB
没有看完题呀,原来长度都相同。
直接裸dp f[i][S] 表示T的前i位,n个串的匹配状态为S的方案数。
注意因为长度都相同,只能从第一位开始匹配呀!!!
然后水了。
AC 100:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector> #define c(w,i) ((w>>i)&1)
#define mod 1000003 using namespace std; int n,K,cnt,f[][],cv[][];
char S[][]; int main(){
freopen("test.in","r",stdin);
int T;
scanf("%d",&T);
while(T--){
memset(f,,sizeof(f));
scanf("%d%d",&cnt,&K);
for(int i=;i<cnt;i++) scanf("%s",S[i]);
n=strlen(S[]);
for(int i=;i<n;i++){
for(int t=;t<;t++){
cv[i][t]=;
for(int j=;j<cnt;j++){
if(S[j][i]=='?'
||S[j][i]==t+'a') cv[i][t]|=(<<j);
}
}
}
f[][(<<cnt)-]=;
for(int i=;i<n;i++)
for(int j=;j<(<<cnt);j++){
if(f[i][j]){
for(int t=;t<;t++)
(f[i+][j&cv[i][t]]+=f[i][j])%=mod;
}
}
int ans=;
for(int w=;w<(<<cnt);w++){
int tmp=;
for(int i=;i<cnt;i++) if(c(w,i)) tmp++;
if(tmp==K) (ans+=f[n][w])%=mod;
}
printf("%d\n",ans);
}
return ;
}
BZOJ1879 Bill的挑战的更多相关文章
- BZOJ-1879 Bill的挑战 状态压缩DP
MD....怎么又是状压....... 1879: [Sdoi2009]Bill的挑战 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 537 Solved ...
- 【BZOJ1879】[SDOI2009]Bill的挑战(动态规划)
[BZOJ1879][SDOI2009]Bill的挑战(动态规划) 题面 BZOJ 洛谷 题解 本来还想着容斥来着,这个数据范围直接暴力就好.设\(f[i][S]\)表示当前填到了第\(i\)位,和\ ...
- 【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP
[BZOJ1879][Sdoi2009]Bill的挑战 Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含 ...
- [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp
Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...
- bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战
http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...
- 【BZOJ1879】【SDOI2009】Bill的挑战 [状压DP]
Bill的挑战 Time Limit: 4 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第一行:一个整数T, ...
- [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)
[BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...
- bzoj 1879: [Sdoi2009]Bill的挑战
题目链接 bzoj 1879: [Sdoi2009]Bill的挑战 题解 n<=15,装压吧 对所有字符串进行装压 可以预处理一个数组can[i][j]表示所有的字符串中,有哪些可以在第i位匹配 ...
- [LuoguP2167][SDOI2009]Bill的挑战_容斥原理/状压dp
Bill的挑战 题目链接:https://www.luogu.org/problem/P2167 数据范围:略. 题解: 因为$k$特别小,想到状压. 状压的方式也非常简单,就是暴力枚举. 但是会不会 ...
随机推荐
- winform客户端程序实时读写app.config文件
新接到需求,wcf客户端程序运行时,能实时修改程序的打印机名称: 使用XmlHelper读写 winform.exe.config文件修改后始终,不能实时读取出来,查询博客园,原来已有大神解释了: 获 ...
- 【swagger】1.swagger提供开发者文档--简单集成到spring boot中【spring mvc】【spring boot】
swagger提供开发者文档 ======================================================== 作用:想使用swagger的同学,一定是想用它来做前后台 ...
- 转: NetBean远程开发的格式与过程
1. 介绍远程3种模式 https://netbeans.org/kb/docs/cnd/remote-modes.html 评注:英文的,3种模式讲的非常到位.服务器开发还是全远程比较不错.
- centos 7 安装官方LAMP(Apache+PHP5+MySQL)
启用Apache2 yum install httpd systemctl start httpd.service systemctl status httpd systemctl enable ht ...
- SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)
--====================================================== --SQL基础-->层次化查询(START BY ... CONNECT BY ...
- Git的使用 -- 用git玩翻github,结尾有惊喜!有惊喜!有惊喜!林妙妙看了说:牛呲呼啦带闪电 (三)(超详解)
简介 上一篇主要讲解的是Git安装及配置,这一篇就详细的从无到有的来用Git玩翻github. 一.什么是Github Github是全球最大的社交编程及代码托管网站(https://github.c ...
- windows核心编程之进程间共享数据
有时候我们会遇到window进程间共享数据的需求,例如说我想知道系统当前有多少某个进程的实例. 我们能够在程序中定义一个全局变量.初始化为0.每当程序启动后就加1.当然我们我们能够借助第三方介质来储存 ...
- 【日常学习】【二叉树遍历】Uva548 - Tree题解
这道题目本身不难,给出后序遍历和中序遍历,求到节点最小路径的叶子,同样长度就输出权值小的叶子. Uva上不去了,没法測.基本上是依照ruka的代码来的.直接上代码 //Uva548 Tree #inc ...
- 【转载】FAT12格式的引导程序(2)
1.用WinImage来写入到引导区的详细步骤: 启动WinImage后,打开“文件”菜单,单击菜单中的“打开”命令. 选择之前保存的磁盘镜像文件“boot.img”或者“boot.ima”. 打开 ...
- 线程、SMP、微内核