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$特别小,想到状压. 状压的方式也非常简单,就是暴力枚举. 但是会不会 ...
随机推荐
- scss - 语法
1.在一个样式导入另一个样式(@import "example.css") 2.scss单行注释不会显示出来 3.强大的变量(定义后,全局可使用) 4.全局默认变量(加!defau ...
- three.js 源代码凝视(十五)Math/Plane.js
商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 - 本博客专注于 敏捷开发 ...
- 字符串类型ip与数值型ip地址相互转换
/** * 返回Integer类型的ip地址 * @return */ private static Integer ipToInt(){ String ip="192.168.1.201& ...
- 【转载】TCP粘包问题分析和解决(全)
TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送 ...
- 【日常学习】【二叉树遍历】Uva548 - Tree题解
这道题目本身不难,给出后序遍历和中序遍历,求到节点最小路径的叶子,同样长度就输出权值小的叶子. Uva上不去了,没法測.基本上是依照ruka的代码来的.直接上代码 //Uva548 Tree #inc ...
- 在DataGridView控件中实现冻结列分界线
我们在使用Office Excel的时候,有很多时候需要冻结行或者列.这时,Excel会在冻结的行列和非冻结的区域之间绘制上一条明显的黑线.如下图: (图1) WinForm下的DataGridVie ...
- 常用到的JS 验证(包括例子)
//验证是否为空 function check_blank(obj, obj_name){ if(obj.value != ''){ retur ...
- Android应用之——最新版本号SDK V2.4实现QQ第三方登录
为什么要写这篇博客呢?由于.我在做这个第三方登录的时候,找了非常多资料,发现要么就是过时了.要么就是说的非常不清楚.非常罗嗦.并且非常多都是一些小demo,不是什么实例.甚至连腾讯官方的文档都有这个问 ...
- HDU2255 奔小康赚大钱 【模板】 二分图完美匹配
基本概念 二分图有两个种点:X和Y.X与Y之间存在一些边,每个边有一个权值.现要求求一组X与Y间的通过边实现的一一匹配,使得得到的边权和最大. 总体过程 对每个X节点设置一个顶标Xl,初值为与X相邻的 ...
- timestamp 转 date 处理后再转timestamp
package com.jmu.ccjoin.service.impl; import java.sql.Timestamp;import java.util.Calendar;import java ...