AC自动机建立fail树后树上DP

  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <iostream>
  4. # include <string.h>
  5. # include <algorithm>
  6. # include <queue>
  7. # define IL inline
  8. # define RG register
  9. # define ll long long
  10. # define Fill(a, b) memset(a, b, sizeof(a))
  11. using namespace std;
  12. IL ll Read(){
  13. RG char c = getchar(); RG ll x = 0, z = 1;
  14. for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
  15. for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + c - '0';
  16. return x * z;
  17. }
  18. const int MAXN(1010);
  19. struct AC{
  20. int fail, ch[3], num;
  21. } tree[MAXN];
  22. int n, cnt, k, f[MAXN][MAXN], ans;
  23. char t[MAXN];
  24. queue <int> Q;
  25. IL void Insert(){
  26. RG int len = strlen(t), x = 0;
  27. for(RG int i = 0; i < len; i++){
  28. if(!tree[x].ch[t[i] - 'A']) tree[x].ch[t[i] - 'A'] = ++cnt;
  29. x = tree[x].ch[t[i] - 'A'];
  30. }
  31. tree[x].num++;
  32. }
  33. IL void Bfs(){
  34. while(!Q.empty()) Q.pop();
  35. for(RG int i = 0; i < 3; i++)
  36. if(tree[0].ch[i]) Q.push(tree[0].ch[i]);
  37. while(!Q.empty()){
  38. RG int u = Q.front(); Q.pop();
  39. for(RG int i = 0; i < 3; i++)
  40. if(tree[u].ch[i]){
  41. tree[tree[u].ch[i]].fail = tree[tree[u].fail].ch[i];
  42. Q.push(tree[u].ch[i]);
  43. }
  44. else tree[u].ch[i] = tree[tree[u].fail].ch[i];
  45. tree[u].num += tree[tree[u].fail].num;
  46. }
  47. }
  48. int main(){
  49. n = Read(); k = Read();
  50. for(RG int i = 1; i <= n; i++){
  51. scanf(" %s", t);
  52. Insert();
  53. }
  54. Bfs();
  55. Fill(f, -127); f[0][0] = 0;
  56. for(RG int K = 1; K <= k; K++){
  57. for(RG int i = 0; i <= cnt; i++)
  58. for(RG int j = 0; j < 3; j++)
  59. f[K][tree[i].ch[j]]=max(f[K][tree[i].ch[j]],f[K - 1][i] + tree[tree[i].ch[j]].num);
  60. }
  61. for(RG int i = 0; i <= cnt; i++)
  62. ans = max(ans, f[k][i]);
  63. printf("%d\n", ans);
  64. return 0;
  65. }

[USACO12JAN]Video Game Combos的更多相关文章

  1. 洛谷 P3041 [USACO12JAN] Video Game Combos

    题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...

  2. 【USACO12JAN】视频游戏的连击Video Game Combos

    题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...

  3. [Luogu3041][USACO12JAN]视频游戏的连击Video Game Combos

    题面 sol 设\(f_{i,j}\)表示填了前\(i\)个字母,在\(AC\)自动机上跑到了节点\(j\)的最大得分.因为匹配需要暴跳\(fail\)所以预先把\(fail\)指针上面的匹配数传下来 ...

  4. 洛谷P3041 视频游戏的连击Video Game Combos [USACO12JAN] AC自动机+dp

    正解:AC自动机+dp 解题报告: 传送门! 算是个比较套路的AC自动机+dp趴,,, 显然就普普通通地设状态,普普通通地转移,大概就f[i][j]:长度为i匹配到j 唯一注意的是,要加上所有子串的贡 ...

  5. P3041 [USACO12JAN]视频游戏的连击Video Game Combos

    思路 简单的AC自动机上dp,暴力跳fail向子节点直接转移即可 代码 #include <cstdio> #include <algorithm> #include < ...

  6. 【题解】[USACO12JAN]视频游戏的连击Video Game Combos

    好久没有写博客了,好惭愧啊……虽然这是一道弱题但还是写一下吧. 这道题目的思路应该说是很容易形成:字符串+最大值?自然联想到学过的AC自动机与DP.对于给定的字符串建立出AC自动机,dp状态dp[i] ...

  7. [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机+DP)

    Description 贝西正在打格斗游戏.游戏里只有三个按键,分别是“A”.“B”和“C”.游戏中有 N 种连击 模式,第 i 种连击模式以字符串 Si 表示,只要贝西的按键中出现了这个字符串,就算 ...

  8. [USACO12Jan][luogu3041] Video Game Combos [AC自动机+dp]

    题面 传送门 思路 首先,有一个非常显然的思路就是dp: 设$dp[i][j]$表示前i个字符,最后一个为j 然后发现这个东西有后效性 改!设$dp[i][j]$代表前i个字符,最后15个的状态为j( ...

  9. 【洛谷 P3041】 [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机,dp)

    题目链接 手写一下AC自动机(我可没说我之前不是手写的) Trie上dp,每个点的贡献加上所有是他后缀的串的贡献,也就是这个点到根的fail链的和. #include <cstdio> # ...

随机推荐

  1. java递归

    package com.sun.test; import java.util.ArrayList; import java.util.List; /** * 递归 * */ public class ...

  2. chrome下input文本框自动填充背景问题解决

    chrome下input文本框会自动填充背景,只需要给文本框加一个样式即可解决问题 input:-webkit-autofill {-webkit-box-shadow: 0 0 0px 1000px ...

  3. c中const定义的问题

    /* 这题有个疑问: const double BASE1=BREAK1*RATE1; //第二个分界点前总共要缴的税收 const double BASE2=BASE1+(BREAK2-BREAK1 ...

  4. WinXP系统下Opencms的安装与配置

    1.WinXP系统下安装opencms (1)mysql已安装5.1.40 cmd命令行:mysql   -uroot  -proot (2)OpenCMS在安装时要求MySQL系统变量“max_al ...

  5. 业余草分享 Spring Boot 2.0 正式发布的新特性

    就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...

  6. 【2016北京集训测试赛(十六)】 River (最大流)

    Description  Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...

  7. 运行web项目端口占用问题

    ---恢复内容开始--- 有时候运行web项目会提示8080端口已经被占用这一类问题(Error running Tomcat8: Address localhost:1099 is already ...

  8. TCP协议的三次握手和四次分手

    HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用. ...

  9. java 集合框架(十六)Map

    一.概述 Map是一个包含键值对的集合,一个map不能有重复的键(key),而且每个键至多只能对应一个值.Map同Collection一样,它的所有通用实现都会提供一个转换器构造函数,接收一个Map类 ...

  10. 【前端】Vue和Vux开发WebApp日志一、整合vue+cordova和webpack+gulp

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux.html 项目github地址:https://github.com/shamoyuu/vue-vu ...