链接

dp[i][j]表示长度为i在节点J的时候的权值最大值,根据trie树转移一下就行,需要每次都取最小的,所以需要另开一数组保存字典序最小的状态。

  1. #include <iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<stdlib.h>
  6. #include<vector>
  7. #include<cmath>
  8. #include<queue>
  9. #include<set>
  10. #include<string>
  11. using namespace std;
  12. #define N 1105
  13. #define LL long long
  14. #define INF 0xfffffff
  15. const double eps = 1e-;
  16. const double pi = acos(-1.0);
  17. const double inf = ~0u>>;
  18. const int child_num = ;
  19. char vir[][];
  20. string o[][N];
  21. class AC
  22. {
  23. private:
  24. int ch[N][child_num];
  25. int fail[N];
  26. int Q[N];
  27. int val[N];
  28. int sz;
  29. int id[];
  30. int dp[][N];
  31. char s[N];
  32. public:
  33. void init()
  34. {
  35. fail[] = ;
  36. for(int i = ; i < child_num ;i++)
  37. id[i+'a'] = i;
  38. }
  39. void reset()
  40. {
  41. memset(ch[],,sizeof(ch[]));
  42. memset(val,,sizeof(val));
  43. sz = ;
  44. }
  45. void insert(char *a,int key)
  46. {
  47. int p = ;
  48. for(; *a ; a++)
  49. {
  50. int d= id[*a];
  51. if(ch[p][d]==)
  52. {
  53. memset(ch[sz],,sizeof(ch[sz]));
  54. s[sz] = *a;
  55. ch[p][d] = sz++;
  56. }
  57. p = ch[p][d];
  58. }
  59. val[p] = key;
  60. }
  61. void construct()
  62. {
  63. int i,head=,tail = ;
  64. for(i = ; i < child_num ;i++)
  65. {
  66. if(ch[][i])
  67. {
  68. fail[ch[][i]] = ;
  69. Q[tail++] = ch[][i];
  70. }
  71. }
  72. while(head!=tail)
  73. {
  74. int u = Q[head++];
  75. val[u]+=val[fail[u]];
  76. for(i = ; i < child_num ; i++)
  77. {
  78. if(ch[u][i])
  79. {
  80. fail[ch[u][i]] = ch[fail[u]][i];
  81. Q[tail++] = ch[u][i];
  82. }
  83. else ch[u][i] = ch[fail[u]][i];
  84. }
  85. }
  86. }
  87. void work(int n)
  88. {
  89. int i,j,g;
  90. for(i = ; i <= n ;i++)
  91. for(j = ;j < sz ; j++)
  92. {
  93. dp[i][j] = -INF;
  94. o[i][j].clear();
  95. }
  96. dp[][] = ;
  97. for(i = ; i < n ;i++)
  98. {
  99. for(j = ; j < sz ; j++)
  100. for(g = ; g < child_num ; g++)
  101. {
  102. int tv = dp[i][j]+val[ch[j][g]];
  103. if(dp[i+][ch[j][g]] <= tv)
  104. {
  105. if(dp[i+][ch[j][g]]<tv||o[i+][ch[j][g]]>o[i][j]+char(g+'a'))
  106. o[i+][ch[j][g]] = o[i][j]+char(g+'a');
  107. dp[i+][ch[j][g]] = dp[i][j]+val[ch[j][g]];
  108. }
  109. }
  110. }
  111. int ans = ,y=,x=;
  112. for(i = ; i <=n ;i++)
  113. for(j = ;j < sz ; j++)
  114. {
  115. if(ans<=dp[i][j])
  116. {
  117. if(ans<dp[i][j]||(y==i&&o[i][j]<o[i][x]))
  118. {
  119. ans = dp[i][j];
  120. y = i;
  121. x = j;
  122. }
  123. }
  124. }
  125. g = ;
  126. if(ans==) puts("");
  127. else
  128. cout<<o[y][x]<<endl;
  129. }
  130. }ac;
  131. int main()
  132. {
  133. int n,i,m,t;
  134. ac.init();
  135. cin>>t;
  136. while(t--)
  137. {
  138. scanf("%d%d",&n,&m);
  139. ac.reset();
  140. for(i = ;i <= m ;i++)
  141. scanf("%s",vir[i]);
  142. for(i = ; i <= m ;i++)
  143. {
  144. int v;
  145. scanf("%d",&v);
  146. ac.insert(vir[i],v);
  147. }
  148. ac.construct();
  149. ac.work(n);
  150. }
  151. return ;
  152. }

hdu2296Ring(ac自动机+dp)的更多相关文章

  1. POJ1625 Censored!(AC自动机+DP)

    题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...

  2. HDU2296 Ring(AC自动机+DP)

    题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...

  3. HDU2457 DNA repair(AC自动机+DP)

    题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...

  4. hdu 4117 GRE Words AC自动机DP

    题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...

  5. hdu 2457(ac自动机+dp)

    题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...

  6. HDU 2425 DNA repair (AC自动机+DP)

    DNA repair Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. HDU2296——Ring(AC自动机+DP)

    题意:输入N代表字符串长度,输入M代表喜欢的词语的个数,接下来是M个词语,然后是M个词语每个的价值.求字符串的最大价值.每个单词的价值就是单价*出现次数.单词可以重叠.如果不止一个答案,选择字典序最小 ...

  8. tyvj P1519 博彩游戏(AC自动机+DP滚动数组)

    P1519 博彩游戏 背景 Bob最近迷上了一个博彩游戏…… 描述 这个游戏的规则是这样的:每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列:有M个序列,如果某个序列是产生的随机序列的 ...

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

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...

  10. [BZOJ 3530] [Sdoi2014] 数数 【AC自动机+DP】

    题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. ...

随机推荐

  1. SQL简介

    SQL 是用于访问和处理数据库的标准的计算机语言. 什么是 SQL? SQL 指结构化查询语言 SQL 使我们有能力访问数据库 SQL 是一种 ANSI 的标准计算机语言 编者注:ANSI,美国国家标 ...

  2. String类中一些的方法的应用

    一.整理string类 1.Length():获取字串长度: 2.charAt():获取指定位置的字符: 3.getChars():获取从指定位置起的子串复制到字符数组中:(它有四个参数) 4.rep ...

  3. 《Linux内核设计与实现》CHAPTER18阅读梳理

    <Linux内核设计与实现>CHAPTER18阅读梳理 [学习时间:2hours] [学习内容:bug的来源分析:bug调试途径] 一.bug来源 1.内核中的bug 内核中的bug表现得 ...

  4. sshpass 用法举例

    关于sshpass 背景 在Linux后台中,经常会用到ssh.scp等命令.需要进行认证,手动输入密码,是交互式的过程. 当将ssh.scp等命令做成自动化脚本时,可能需要非交互式的登录过程,此时可 ...

  5. [转]使用Gradle发布Android开源项目到JCenter

      转自:http://blog.csdn.net/maosidiaoxian/article/details/43148643 使用Gradle发布Android开源项目到JCenter 分类: G ...

  6. Python开发程序:ATM+购物商城

    一.程序要求 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还 ...

  7. App软件开发的10个常用技巧

    移动应用市场用户争夺战日益激烈,原来做APP拼想法拼创意拼是否抓住用户痛点.现在,精细化用户体验成为了一个APP能否留存用户的关键问题,一旦用户觉得体验不畅,马上就有竞品APP后补,如何开发高性能的移 ...

  8. 根据value选择select

    <script> var tem="{$Zgoods.type_2}"; $("#type_2 option[value='"+tem+" ...

  9. .net下的跨域问题

    环境: IIS7.0 MVC 4.0     公司官网 asp.net      需要的报名系统,需要有后台管理 由于是配合传统产业,所以MVC系统的数据,是由AIPS系统提供. (制作前是考虑去年用 ...

  10. RF《Quick Start Guide》操作总结

    这篇文章之所以会给整理出来,是因为学了一个季度的RF后,再去看官网的这个文档,感触破多,最大的感触还是觉得自己走了不少弯路,还有些是学习方法上的弯路.在未查看这类官网文档之前,更多的是看其他各种人的博 ...