题目: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的挑战的更多相关文章

  1. BZOJ-1879 Bill的挑战 状态压缩DP

    MD....怎么又是状压....... 1879: [Sdoi2009]Bill的挑战 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 537 Solved ...

  2. 【BZOJ1879】[SDOI2009]Bill的挑战(动态规划)

    [BZOJ1879][SDOI2009]Bill的挑战(动态规划) 题面 BZOJ 洛谷 题解 本来还想着容斥来着,这个数据范围直接暴力就好.设\(f[i][S]\)表示当前填到了第\(i\)位,和\ ...

  3. 【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP

    [BZOJ1879][Sdoi2009]Bill的挑战 Description Input 本题包含多组数据.  第一行:一个整数T,表示数据的个数.  对于每组数据:  第一行:两个整数,N和K(含 ...

  4. [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp

    Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...

  5. bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战

    http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...

  6. 【BZOJ1879】【SDOI2009】Bill的挑战 [状压DP]

    Bill的挑战 Time Limit: 4 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第一行:一个整数T, ...

  7. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  8. bzoj 1879: [Sdoi2009]Bill的挑战

    题目链接 bzoj 1879: [Sdoi2009]Bill的挑战 题解 n<=15,装压吧 对所有字符串进行装压 可以预处理一个数组can[i][j]表示所有的字符串中,有哪些可以在第i位匹配 ...

  9. [LuoguP2167][SDOI2009]Bill的挑战_容斥原理/状压dp

    Bill的挑战 题目链接:https://www.luogu.org/problem/P2167 数据范围:略. 题解: 因为$k$特别小,想到状压. 状压的方式也非常简单,就是暴力枚举. 但是会不会 ...

随机推荐

  1. esrichina

    http://www.esrichina.com.cn/arcgis10.5/index.html#fillback=0100307b617b7b7b363736363039323733627b617 ...

  2. 【flyway】开源的数据库版本管理工具【migration】

    开源的数据库版本管理工具[migration] 记录

  3. LVM创建

    LVM介绍 PV(Physical Volume) - 物理卷 物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备 VG(Volume Group ...

  4. [React] Create and import React components with Markdown using MDXC

    In this lesson I demonstrate how to use the library MDXC to create and import React components with ...

  5. 2.6.2 用NPOI操作EXCEL--设置密码才可以修改单元格内容

    2.6.2 用NPOI操作EXCEL--设置密码       有时,我们可能需要某些单元格只读,如在做模板时,模板中的数据是不能随意让别人改的.在Excel中,可以通过“审阅->保护工作表”来完 ...

  6. Intel Naming Strategy--2

    http://en.wikipedia.org/wiki/Intel_Corporation#Naming_strategy Naming strategy[edit] In 2006, Intel ...

  7. HashMap源代码学习笔记

        HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是由于它是通过计算散列码来决定存储的位置. HashMap中主要是通过key的hashCode来计算hash值的 ...

  8. Eureka vs Zookeeper

    著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性)和P(分区容错性).由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡.在此Zookeeper保证 ...

  9. 百度ai 基于node 语音识别 音频文件类型转换

    百度ai 基于node 语音识别 音频文件类型转换 项目简介 源代码移步:https://github.com/xuess/ai-baidu-node 本项目主要功能为,本地音频语音识别和文件类型转换 ...

  10. linux以及git和maven常用命令

    maven常用命令: clean install -Dmaven.test.skip -Ptest-lx   (注意:test-lx是pom文件名) 其他 https://www.cnblogs.co ...