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$特别小,想到状压. 状压的方式也非常简单,就是暴力枚举. 但是会不会 ...
随机推荐
- 分享一个ci 框架下取不到cookie的问题
由于项目中用到了网银支付,在360极速浏览器和其它双核浏览器中,当跳转到付款时他们会强制的把浏览器的模式改为兼容模式,这样一来在极速模式下的cookie在兼容模式下取不到,因为浏览器切换模式的时候us ...
- CSS 的导入方式 (link or import ?)
前言 最常看见的CSS的使用方式有三种 1. 在span, div 等标签上直接使用 style 属性定义CSS <span style="color:blue">Th ...
- PHP通用分页
php通用分页,先看下样式 代码如下: <style> body { font-size:12px;font-family:verdana;width:100%; } div.page{ ...
- oracle死锁解决经常用法(屡试不爽)
--1.查询被锁的情况 select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$sessi ...
- unity常见问题之20题
1:天空盒有接缝怎么解决? 答:在贴图导入设置里设置Wrap Mode为"Clamp". 2: DDS格式怎么不显示? 答:Unity不支持DDS格式,Unity会将除DDS外的其 ...
- 跨平台C++:(前言)正确打开C++的方式
接触C++已经十五年了...但是对于C++而言,我至今是个门外汉,不是谦虚,而是确实不得其门而入. 历程是这样的—— 大学考研要考C++,就自学了.研没考上,C++算是学了,准确的说是C++的语法,以 ...
- Appium基于安卓的各种FindElement的控件定位
转自:http://www.2cto.com/kf/201410/340345.html 1. findElementByName 1.1 示例 ? 1 2 el = driver.findEleme ...
- Android 代码写控件
1.设置dialog弹出anthor public static SearchDialog getSearchDialog(Context context,OnDismissListener list ...
- HUNNU-10307-最优分解问题
点击打开题目连接 # include <queue> # include <cstdio> # include <cstring> # include <io ...
- Java,如何获取文件的MD5值
MessageDigest类封装得很不错,简单易用 不多说,直接上代码 import java.io.FileInputStream;import java.security.MessageDiges ...