题解:题意不再说了,题目很清楚的。

思路:因为N<=10,所以考虑状态压缩 AC自动机中 val[1<<i]: 表示第i个字符串。AC自动机中fail指针是指当前后缀在其他串里面所能匹配的最长前缀的长度,然后我们在这里统计一下以该点结束所能包含的字符串的数量(就是在fail树中该点到根节点所经过的所有为单词结尾的点,在这里我们只要val[x] |= val[fail[x]]就行了,因为val[fail[x]]已经统计过 点fail[x]到根的值了)。

  考虑dp[i][j][k]:表示长度为i,第j个状态点,k为包含的单词的状态,  是否存在。然后转移方程为:if( ch[m-1][j][k] ) ch[m][ ch[j][ char ] ][ k|val[ ch[j][char] ] ]=1;(char : 为第j个状态再往后走一步到达的状态);

  我们的长度是一步一步走的,而且当前步数,仅有上一步确定,所以我们可以压缩步数为奇数偶数,变为:if( ch[ (m-1)&1 ][j][k] ) ch[ m&1 ][ ch[j][ char ] ][ k|val[ ch[j][char] ] ]=1;最后我们只要在第m步的每个状态包含不停字符串状态时的答案里面去最大值就行了。

参考代码:

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=;
int ch[maxn][],val[maxn],fail[maxn];
int w[],tot,n,m,Ans[maxn];
bool dp[][maxn][<<];
char s[]; void Init()
{
tot=;
memset(val,,sizeof val);
memset(ch[tot],,sizeof ch[tot]);
} void Insert(char *s,int x)
{
int len=strlen(s),u=;
for(int i=;i<len;++i)
{
int c=s[i]-'a';
if(!ch[u][c]) {ch[u][c]=tot++;memset(ch[tot],,sizeof ch[tot]);}
u=ch[u][c];
}
val[u]=<<x;
} void GetFail()
{
queue<int>q;
for(int i=;i<;++i)
if(ch[][i]) q.push(ch[][i]);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=;i<;++i)
{
int v=ch[u][i];
if(!v){ch[u][i]=ch[fail[u]][i];continue;}
q.push(v);
fail[v]=ch[fail[u]][i];
val[v]|=val[fail[v]];
}
}
} void Work()
{
dp[][][]=;
for(int i=;i<=m;++i)
{
memset(dp[i&],,sizeof dp[i&]);
for(int j=;j<tot;++j)
for(int k=;k<;++k)
for(int z=;z<(<<n);++z)
{
if(dp[(i-)&][j][z])
dp[i&][ch[j][k]][z|val[ch[j][k]]]=;
}
}
} int GetAns(int x)
{
int ans=;
for(int i=;i<n;++i)
if(x&(<<i)) ans+=w[i];
return ans;
} int main()
{
scanf("%d%d",&n,&m);
Init();
for(int i=;i<n;++i)
scanf("%s%d",s,w+i),Insert(s,i);
GetFail();
Work();
int res=-INF; for(int j=;j<(<<n);++j) Ans[j]=GetAns(j);
for(int i=;i<tot;++i)
for(int j=;j<(<<n);++j)
if(dp[m&][i][j]) res=max(res,Ans[j]); if(res<) puts("Unhappy!");
else printf("%d\n",res); return ;
}

计蒜客-蒜场抽奖(AC自动机+状态压缩DP)的更多相关文章

  1. HDU 4511 (AC自动机+状态压缩DP)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...

  2. POJ 3691 (AC自动机+状态压缩DP)

    题目链接:  http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...

  3. hdu 4057(ac自动机+状态压缩dp)

    题意:容易理解... 分析:题目中给的模式串的个数最多为10个,于是想到用状态压缩dp来做,它的状态范围为1-2^9,所以最大为2^10-1,那我们可以用:dp[i][j][k]表示长度为i,在tri ...

  4. bzoj1195 神奇的ac自动机+状态压缩dp

    /* 难的不是ac自动机,是状态压缩dp 之前做了一两题类似题目,感觉理解的还不够透彻 */ #include<iostream> #include<cstdio> #incl ...

  5. HDU 4758 Walk Through Squares( AC自动机 + 状态压缩DP )

    题意:给你两个串A,B, 问一个串长为M+N且包含A和B且恰好包含M个R的字符串有多少种组合方式,所有字符串中均只含有字符L和R. dp[i][j][k][S]表示串长为i,有j个R,在自动机中的状态 ...

  6. HDU 4057 Rescue the Rabbit ( AC自动机 + 状态压缩DP )

    模板来自notonlysuccess. 模式串只有10个,并且重复出现的分值不累加,因此很容易想到状态压缩. 将模式串加入AC自动机,最多有10*100个状态. dp[i][j][k]:串长为i,在T ...

  7. hdu 2825(ac自动机+状态压缩dp)

    题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...

  8. 计蒜客 疑似病毒 (AC自动机 + 可达矩阵)

    链接 : Here! 背景 : 开始我同学是用 AC自动机 + DP 的方法来做这道题, 这道题的标签是 AC自动机, 动态规划, 矩阵, 按道理来说 AC自动机 + DP 应该是能过的, 但是他不幸 ...

  9. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...

随机推荐

  1. html5 svg实现不规则形状图片触发事件

    html5 svg实现不规则形状图片触发事件<pre><!DOCTYPE html><html lang="en"> <head> ...

  2. pscp命令详解

    注意:只能在winds下执行 环境准备 1.先下载pscp软件,这里是我的云盘地址: 链接:https://pan.baidu.com/s/1mkzRMv-aosC94KbMcMea9w 提取码:k0 ...

  3. 深入理解计算机系统 第三章 程序的机器级表示 part3

    这周看了刘老师提供的相关视频,以及书中对应的章节“3.7 过程” 这一节分为运行时栈.转移控制.数据传送.栈上的局部存储.寄存器中的局部存储空间和递归过程这 6 个小节 其中前 3 小节看懂了一部分内 ...

  4. 014.Kubernetes二进制部署docker

    一 部署docker 1.1 部署docker组件 docker 运行和管理容器,kubelet 通过 Container Runtime Interface (CRI) 与它进行交互. 1.2 下载 ...

  5. linux日常笔记(1)

    1.SELlinux SELinux是 美国国家安全局 (NSA) 对于 强制访问控制的实现 =>可以使root受限的权限 关闭SELinux=>修改配置文件,永久生效; sed -i ' ...

  6. rsync同步基本用法

                                                                                                        ...

  7. opencv 6 图像轮廓与图像分割修复 3 图像的矩,分水岭,图像修补

    图像的矩 矩的计算:moments()函数 计算轮廓面积:contourArea()函数 #include "opencv2/highgui/highgui.hpp" #inclu ...

  8. SQLServer2008R2(百度网盘)下载与安装教程

    很久没有安装过这个了,今天安装有点生疏了,这里记录一下分享 分为三块块1.下载地址,2.安装图解  ,3.安装失败问题 1.sqlserver 2008 r2 百度下载地址链接:下载 cn_sql_s ...

  9. Linux(CentOS65)

    首先下载VMware,然后下载CentOS镜像文件,VM的版本尽量高一点,因为软件一般都有向下兼容性,如果版本太低,可能匹配不了CentOS. 安装VMTools工具 主要用于虚拟主机显示优化与调整, ...

  10. ES6扩展运算符...

    对象的扩展运算符理解对象的扩展运算符其实很简单,只要记住一句话就可以: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中 let bar = { a: 1, b: 2 ...