题目: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. 学习日记之抽象工厂模式和Effective C++

    抽象工厂模式(Abstract Factory):提供一个创建一系列相关或者相互依赖对象的接口.而无需制定他们详细的类. (1),工厂方法模式是定义一个用于创建对象的接口.让子类决定实例化哪一个类. ...

  2. 【Todo】UDP P2P打洞原理

    参考以下两篇文章: https://my.oschina.net/ososchina/blog/369206 http://m.blog.csdn.net/article/details?id=666 ...

  3. Override和Overload差别,Overloaded的方法能否够改变返回值的类型?

    Overload是重载的意思, Override是覆盖的意思,也就是重写. 重载Overload表示同一个类中能够有多个名称同样的方法,但这些方法的參数列表各不同样(即參数个数或类型不同). 重写Ov ...

  4. Java 实现 淘宝秒杀 聚划算 自己主动提醒 源代码

    说明 本实例可以监控聚划算的抢购button,在聚划算整点聚的时间到达时自己主动弹开页面(URL自定义). 能够自己定义监控持续分钟数,同一时候还能够通过多线程加快刷新速度. 源代码 package ...

  5. java中简单字符替换

    在网络编程中,假设URL含有特殊字符,如空格.'#'等,server将无法识别导致无法获得正确的參数值.我们须要将这些特殊字符转换成server能够识别的字符,比如将空格转换成'%20'.给定一个字符 ...

  6. java开始到熟悉70-71

    本次内容:file类 package array; /** * file类 */ import java.io.File; import java.io.IOException; public cla ...

  7. 常见ODBC及OLEDB连接串的写法

    书    名:性能测试进阶指南——LoadRunner11实战 作    者:陈霁 关于数据库连接串的写法

  8. 一起来当网管(一)——Windows Server上的DHCP配置

    学校实验室里大大小小设备还不少,网络环境虽说不复杂,但也比家用的复杂一些.就当练练手吧,刚好写点文章,免得以后实验室网络没人管了.那么就先从DHCP的配置来讲吧! 1.DHCP是什么.有什么用 DHC ...

  9. &lt;十二&gt;读&lt;&lt;大话设计模式&gt;&gt;之状态模式

    对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的.状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化.在程 ...

  10. EF(Entity Framework)通用DBHelper通用类,增删改查以及列表

    其中 通用类名:DBhelper 实体类:UserInfo 1 //新增 2 DBHelper<UserInfo> dbhelper = new DBHelper<UserInfo& ...