大冥神的代码,以后能贴的机会估计就更少了。。。。所以本着有就贴的好习惯,= =。。。。直接贴

#include <bits/stdc++.h>
using LL = long long ;
#define ALL(v) (v).begin(),(v).end()
#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)char str[100][11];
int n,m;
int weight[100];const int N = 10 * 100 + 5;
int go[N][26],val[N],fail[N],tot;int get_node() {memset(go[tot],-1,sizeof(go[tot]));val[tot] = 0;return tot ++;
}int dp[50 + 1][N],pre[50 + 1][N],pc[50 + 1][N];
std::vector<int> order[50 + 1];void insert(char *s,int w) {int u = 0;for ( ; *s; ++ s) {int c = *s - 'a';if (go[u][c] == -1) go[u][c] = get_node();u = go[u][c];}val[u] += w;
}std::string work() {tot = 0;get_node();for (int i = 0; i < m; ++ i) {insert(str[i],weight[i]);}std::vector<int> vec{0};fail[0] = -1;for (int I = 0; I < (int)vec.size(); ++ I) {int u = vec[I];for (int c = 0; c < 26; ++ c) {if (go[u][c] == -1) continue;int v = go[u][c];int f = fail[u];while (f != -1 && go[f][c] == -1) f = fail[f];fail[v] = f == -1 ? 0 : go[f][c];vec.push_back(v);}}for (int I = (int)vec.size() - 1; I >= 0; -- I) {int u = vec[I];for (int c = 0; c < 26; ++ c) {int f = u;while (f != -1 && go[f][c] == -1) f = fail[f];go[u][c] = f == -1 ? -1 : go[f][c];}for (int f = fail[u]; f != -1; f = fail[f]) {val[u] += val[f];}}memset(dp,-1,sizeof(dp));memset(pre,-1,sizeof(pre));dp[0][0] = 0;for (int i = 0; i <= n; ++ i) {order[i].clear();}order[0].push_back(0);for (int i = 0; i < n; ++ i) {for (int u : order[i]) {for (int c = 0; c < 26; ++ c) {if (go[u][c] == -1) continue;int v = go[u][c];dp[i + 1][v] = std::max(dp[i + 1][v],dp[i][u] + val[v]);}}for (int u : order[i]) {for (int c = 0; c < 26; ++ c) {if (go[u][c] == -1) continue;int v = go[u][c];if (dp[i + 1][v] == dp[i][u] + val[v] && pre[i + 1][v] == -1) {pre[i + 1][v] = u;pc[i + 1][v] = c;order[i + 1].push_back(v);}}}}int ai = 0,au = 0;for (int i = 0; i <= n; ++ i) {for (int u : order[i]) {if (dp[i][u] > dp[ai][au]) {ai = i;au = u;}}}std::string ret;while (ai) {ret.push_back(pc[ai][au] + 'a');au = pre[ai][au];-- ai;}std::reverse(ALL(ret));return ret;
}int main() {int cas;scanf("%d",&cas);while (cas--) {scanf("%d%d",&n,&m);for (int i = 0; i < m; ++ i) {scanf("%s",str[i]);}for (int i = 0; i < m; ++ i) {scanf("%d",weight + i);}printf("%s\n",work().c_str());}
}

  

转载于:https://www.cnblogs.com/get-an-AC-everyday/p/5678879.html

HDU 2296 Ring -----------AC自动机,其实我想说的是怎么快速打印字典序最小的路径...相关推荐

  1. HDU - 2296 Ring(AC自动机+dp)

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

  2. HDU 2296 Ring AC自动机 + DP

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

  3. hdu 6096---String(AC自动机)

    题目链接 Problem Description Bob has a dictionary with N words in it. Now there is a list of words in wh ...

  4. Keywords Search HDU - 2222(AC自动机模板)

    题意: 给定 n个长度不超过 50的由小写英文字母组成的单词准备查询,以及一篇文章,问:文中出现了多少个待查询的单词.多组数据. 题目: In the modern time, Search engi ...

  5. HDU 4787 在线AC自动机 分块(模式串和母串交叉给出,多次求getFail)

    题意: 给定T个测试数据 n个操作 + 插入单词 ? 询问母串中有多少个子串 在上面出现过 ( 子串被加密,即←移动L位 (L为上次询问的答案) ) 分块思路: 因为模式串和母串交叉给出,正常来说应该 ...

  6. hdu 2604 Queuing AC自动机构造递推式-矩阵-结果

    http://acm.hdu.edu.cn/showproblem.php?pid=2604 题意: L个人排队,这一队里男性用m表示,女性用f表示,问长度为L的序列里面不包含形如"fmf& ...

  7. HDU 3058 Generator [AC自动机+期望DP]

    给出M个短串,这些短串由前N个大写字母组成.然后随机的按字符生成字符串,每次生成1~N个字符的概率是相等的,当生成串包含任意一个指定短串时,就停止生成.问生成串的长度的期望是多少. 首先建立Trie图 ...

  8. HDU - 2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    题目链接:点击查看 题目大意:给出 n 个词根,现在要求出长度不大于 len 的单词中,有多少单词包含至少一个词根 题目分析:如果我们反过来想,也就是求出来总的单词数,然后减去不包含词根的单词数,剩下 ...

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

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

  10. 转自kuangbin的AC自动机(赛前最后一博)

    有了KMP和Trie的基础,就可以学习神奇的AC自动机了.AC自动机其实就是在Trie树上实现KMP,可以完成多模式串的匹配.           AC自动机 其实 就是创建了一个状态的转移图,思想很 ...

最新文章

  1. NSIS 刷新ICO缓存
  2. Could not find support-media-compat.aar
  3. 阿里巴巴上线静态开源站点搭建工具 Docsite
  4. Python案例:计算softmax函数值
  5. 学习笔记===《用户体验要素——以用户为中心的产品设计》
  6. springmvc环境的搭建
  7. html 两个表合并,SQL中将两个表合并成一个新表
  8. Java实现简单工厂模式
  9. mac 爱普生打印机驱动_爱普生l301打印机驱动Mac版-爱普生L301驱动Mac版下载 V9.31-PC6苹果网...
  10. 几种物流业务的凭证模板设置说明
  11. HTML Report报告无法正常展示的解决办法
  12. matlab的三维绘图函数,MATLAB中的三维绘图函数总结
  13. Redis源码解读(二十五)——集群模式—failover
  14. 软件工程(C编码实践篇)学习总结
  15. android 配置aspect_Android全面屏适配
  16. Windows下vc开发chrome浏览器工程的一点粗浅理解和封装
  17. 【数学】函数极限计算
  18. 关于抽象类,接口的题目
  19. 为freeswitch 添加h323协议
  20. RNN循环卷积神经网络

热门文章

  1. 启动、关闭、刷新 WINDOWS服务
  2. Android 手机的坐标
  3. 心法利器[57] | 文本多分类问题经验
  4. 从零实现爬虫和情感分类模型(二)
  5. 【论文投稿】SOTA论文也未必能被接收,谷歌科学家Eric Jang谈顶会审稿标准
  6. 摘要抽取算法——最大边界相关算法MMR(Maximal Marginal Relevance)
  7. 机器学习十大经典算法——knn
  8. 虚度大一一年又如何,双非本科大三学弟连斩腾讯字节
  9. 基于Pytorch实现CNN卷积神经网络-Mnist数据集
  10. 【重磅预告】揭秘阿里双11技术进步历程!