hdu_2296_Ring(AC自动机+DP)
题目链接:hdu_2296_Ring
题意:
有m个字符串,每个字符串有一个价值,现在让你组成一个不超过n长度的字符串,使得价值最大
题解:
很明显是在AC自动机上的DP,设dp[i][j]表示当前长度为i,AC自动机上匹配到j这个节点的最大价值,这里要求字典序最小,处理的稍微复杂一点,具体看代码
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int AC_N=*,tyn=;//数量乘串长,类型数
struct AC_automation{
int tr[AC_N][tyn],cnt[AC_N],Q[AC_N],fail[AC_N],tot;
inline int getid(char x){return x-'a';}
void nw(){cnt[++tot]=,fail[tot]=;memset(tr[tot],,sizeof(tr[tot]));}
void init(){tot=-,fail[]=-,nw();}
void insert(char *s,int val,int x=){
for(int len=strlen(s),i=,w;i<len;x=tr[x][w],i++)
if(!tr[x][w=getid(s[i])])nw(),tr[x][w]=tot;
cnt[x]=val;//串尾标记
}
void build(int head=,int tail=){
for(int i=;i<tyn;i++)if(tr[][i])Q[++tail]=tr[][i];
while(head<=tail)for(int x=Q[head++],i=;i<tyn;i++)
if(tr[x][i])fail[tr[x][i]]=tr[fail[x]][i],Q[++tail]=tr[x][i],cnt[tr[x][i]]+=cnt[tr[fail[x]][i]];
else tr[x][i]=tr[fail[x]][i];
}
}AC; char s[][];
string path[][AC_N];
int t,n,m,x,dp[][AC_N]; void fuck(int ans=)
{
memset(dp,-,sizeof(dp)),dp[][]=;
F(i,,n)F(j,,AC.tot)path[i][j].clear();
F(i,,n-)F(j,,AC.tot)if(dp[i][j]!=-)F(k,,)
{
int now=AC.tr[j][k];
if(dp[i][j]+AC.cnt[now]>dp[i+][now])
{
dp[i+][now]=dp[i][j]+AC.cnt[now];
path[i+][now]=path[i][j]+(char)(k+'a');
}else if(dp[i][j]+AC.cnt[now]==dp[i+][now]&&path[i][j]+(char)(k+'a')<path[i+][now])
path[i+][now]=path[i][j]+(char)(k+'a');
}
F(i,,n)F(j,,AC.tot)ans=max(ans,dp[i][j]);
if(ans==){puts("");return;}
string str=" ";
F(i,,n)F(j,,AC.tot)if(dp[i][j]==ans&&(str==" "||(path[i][j].size()<str.size()||(path[i][j].size()==str.size()&&path[i][j]<str))))str=path[i][j];
cout<<str<<endl;
} int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
AC.init();
F(i,,m)scanf("%s",s[i]);
F(i,,m)scanf("%d",&x),AC.insert(s[i],x);
AC.build(),fuck();
}
return ;
}
hdu_2296_Ring(AC自动机+DP)的更多相关文章
- POJ1625 Censored!(AC自动机+DP)
题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
- hdu 4117 GRE Words AC自动机DP
题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...
- hdu 2457(ac自动机+dp)
题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...
- HDU 2425 DNA repair (AC自动机+DP)
DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU2296——Ring(AC自动机+DP)
题意:输入N代表字符串长度,输入M代表喜欢的词语的个数,接下来是M个词语,然后是M个词语每个的价值.求字符串的最大价值.每个单词的价值就是单价*出现次数.单词可以重叠.如果不止一个答案,选择字典序最小 ...
- tyvj P1519 博彩游戏(AC自动机+DP滚动数组)
P1519 博彩游戏 背景 Bob最近迷上了一个博彩游戏…… 描述 这个游戏的规则是这样的:每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列:有M个序列,如果某个序列是产生的随机序列的 ...
- bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...
随机推荐
- 关于对HandlerThread的了解
在Android中经常需要创建一个循环线程,有耗时操作时候,放到里面去操作,如果没有耗时操作,就让该线程处于等待,但是不要杀死它, 最好不要一旦有耗时任务,就立刻创建一个新线程,因为会有性能问题. H ...
- 程序启动的目录不一样.ajax请求的地址跳转会出现的问题
程序启动的目录不一样.ajax请求的地址跳转会出现的问题启动 frontend/web/启动 frontend/ $.ajax({ url:"<?php echo Yii::$app- ...
- jquery 图片遮罩 坠落遮挡效果
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- cout 格式化的一些方法
cout格式化的方式有很多,和C中的printf相比较,在实现方式上更加容易理解. 1.计数进制. 1.十六进制:hex 2.八进制:oct 3.十进制:dec(默认) 在控制进制的时候,可以使用两种 ...
- Eclipse 使用简记
Eclipse 使用简记 本文针对 Eclipse Neon (4.6)版本进行说明,具体而言是 Eclipse IDE for Java EE Developers . 下载 Eclipse ecl ...
- CodeForces 706E Working routine
十字链表. 开一个十字链表,矩阵中每一格作为一个节点,记录五个量: $s[i].L$:$i$节点左边的节点编号 $s[i].R$:$i$节点右边的节点编号 $s[i].U$:$i$节点上面的节点编号 ...
- 使用 voluptuous 校验数据
在 Python 中,我们经常需要对参数进行校验,这是我们有好多种方法,例如写很多 if 啊,或者写正则表达式啊等等,技巧高的人可以写得很巧妙,而技巧一般的人呢,可能会写得很冗长,例如我,经常就不能很 ...
- 《HTML5与CSS3权威指南》读书笔记(上册)—HTML5篇
豆瓣上的评分少且评价不太好,阅读当中发现几处刊物上的小问题,不过线下口碑貌似不错,基本上人手一本 上册五百多页,主讲H5,分为标签,本地存储,离线应用程序,新的API,获取地理位置信息标签包含表单,C ...
- json_encode不编码中文字符的方式
json_encode($array,JSON_UNESCAPED_UNICODE);
- for i in xrange(0,5)使用过程中遇到的问题
文件中共有4行内容. fd = open("C:\Users\william\Desktop\dup_file - Copy (2).txt")for i in xrange(0, ...