题目链接:点击查看

题目大意:给出 n 个字符串,每个字符串都有一个权值,现在问在组成字符串长度不超过 m 的前提下,怎样构造才能使得出现的字符串权值和最大,在满足上个条件的基础上长度最短,如果依然有多个答案,输出字典序最小的答案

题目分析:读完题后可能感觉题目比较复杂无从下手,但因为数据都不算大,而且是多个匹配串,所以我们可以构造AC自动机,获得状态节点,因为题目要求一个最优解,所以可以沿着trie树一直dp转移状态就好了,因为答案要求第一优先级是权值和最大,这个可以用dp维护,第二优先级是长度最短,第三优先级是字典序最小,这两个条件我们可以稍微重载一下字符串比较的运算符就可以了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e3+100;int n,m,k;char s[110];int fail[1010],trie[1010][26],val[110],cnt;int vis[1010];int dp[60][1010];//dp[i][j]:长度为 i ,状态为 j 时的最大值 string str[60][1010];//与dp同步维护字符串bool cmp(string a,string b)//return a<b;
{if(a.size()!=b.size())return a.size()<b.size();return a<b;
} void insert_word(int id)
{int len=strlen(s);int pos=0;for(int i=0;i<len;i++){int to=s[i]-'a';if(!trie[pos][to])trie[pos][to]=++cnt;pos=trie[pos][to];}vis[pos]=id;
}void getfail()
{queue<int>q;for(int i=0;i<26;i++){if(trie[0][i]){fail[trie[0][i]]=0;q.push(trie[0][i]);}}while(!q.empty()){int cur=q.front();q.pop();for(int i=0;i<26;i++){if(trie[cur][i]){fail[trie[cur][i]]=trie[fail[cur]][i];q.push(trie[cur][i]);}elsetrie[cur][i]=trie[fail[cur]][i];}}
}void init()
{cnt=0;memset(vis,false,sizeof(vis));memset(trie,0,sizeof(trie));
}int main()
{
//#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
//#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){init();int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%s",s);insert_word(i);}getfail();for(int i=1;i<=m;i++)scanf("%d",val+i);for(int i=0;i<=n;i++)for(int j=0;j<=cnt;j++)dp[i][j]=-inf;dp[0][0]=0;str[0][0]="";int mmax=0;string ans="";for(int i=0;i<n;i++)for(int j=0;j<=cnt;j++)if(dp[i][j]>=0)for(int k=0;k<26;k++){int nj=trie[j][k];string temp=str[i][j]+char(k+'a');int tt=dp[i][j];if(vis[nj])//如果有贡献 tt+=val[vis[nj]];if(tt>dp[i+1][nj]||tt==dp[i+1][nj]&&cmp(temp,str[i+1][nj])){dp[i+1][nj]=tt;str[i+1][nj]=temp;if(tt>mmax||tt==mmax&&cmp(temp,ans)){mmax=tt;ans=temp;}}}cout<<ans<<endl;}return 0;
}

HDU - 2296 Ring(AC自动机+dp)相关推荐

  1. HDU 2296 Ring AC自动机 + DP

    题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路:  AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...

  2. uvalive4842(AC自动机+DP)

    题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...

  3. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

  4. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  5. 【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)

    Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...

  6. HDU - 4511 小明系列故事——女友的考验(AC自动机+dp)

    题目链接:点击查看 题目大意:小明在点 1 而小明的女朋友在点 n ,现在小明要去找女朋友,满足以下两个条件: 途径的序号满足严格递增 小明的女朋友给小明提出了 m 条路径是不允许走的 在满足上述两条 ...

  7. HDU - 2457 DNA repair(AC自动机+dp)

    题目链接:点击查看 题目大意:给出 n 个匹配串,再给出一个模式串,问最少修改模式串中多少个字母可以使得模式串中不含有任意一个匹配串 题目分析:因为又是模式串与匹配串的题目,虽然与一般意义上的匹配不太 ...

  8. POJ 3691 DNA repair AC自动机 + DP

    题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道  dp[i][j] 为文本串到 第i ...

  9. CDOJ1633 Video Game Combos [AC自动机+dp]

    题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...

最新文章

  1. msql每个数据前面添加某个字符串查询或者更新
  2. mssql 查询当前自增序号_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
  3. FIREBIRD浅历
  4. 移动端点击(click)事件延迟问题的产生与解决方法
  5. html如何使文本变为粗体_javascript – 如何使用节点和.createElement(“b”)使文本变为粗体?...
  6. HDLBits答案(23)_找BUG
  7. 8.2 css3 新增标签 盒子模型 长度单位 颜色 渐变 径像渐变
  8. 呀~ 一个.java的源文件可以写这么多类啊
  9. 光子计算机玩游戏,用于光计算的光子计算机
  10. linux生成固定大小的文件夹的实现
  11. java判断变量是奇书还是偶数_测试值是奇数还是偶数
  12. 宏碁(acer)被攻击:黑客索要 3.25 亿元赎金
  13. Opencv_黑白素描
  14. Android之WindowManager+OpenGL+EGL绘制(十七)
  15. pulse 去马赛克软件_打马赛克就安全了吗?AI消除马赛克,上线三天收获近7000星...
  16. FireFox使用百度网盘插件
  17. 如何从Unity商店下载资源?
  18. 字体裁剪,精简字体,字体瘦身:FontSubsetGUI,FontCreator,FontPruner
  19. 如何重新注册VMware Update Manager(VUM)至vCenter Server中
  20. cluego使用说明_生信分析绘图神器,你值得拥有!

热门文章

  1. mysql autoextend_innodb_autoextend_increment':问题解决方法
  2. php 写 mysql 事件_PHP日歷,包含來自MySQL數據庫的重復事件
  3. MySQL高级 - 锁 - 锁的概述及分类
  4. Nginx负载均衡策略之轮询与加权轮询
  5. 多线程对于共享变量访问带来的安全性问题
  6. 怎样用注解的方式配置Spring?
  7. 关于health的原理
  8. AOP各种表达式,aspectj的关系
  9. HDFS的API操作-获取文件列表信息
  10. SpringMVC拦截器之介绍和搭建环境