题目链接

手写一下AC自动机(我可没说我之前不是手写的)

Trie上dp,每个点的贡献加上所有是他后缀的串的贡献,也就是这个点到根的fail链的和。

  1. #include <cstdio>
  2. #include <queue>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int MAXK = 1010;
  7. const int MAXN = 1010;
  8. struct ACA{
  9. int next[5], num, fail;
  10. }AC[MAXN];
  11. int f[MAXK][MAXN];
  12. int n, k, cnt, ans;
  13. char a[30];
  14. queue <int> q;
  15. void insert(){
  16. int len = strlen(a + 1), p = 0, w;
  17. for(int i = 1; i <= len; ++i){
  18. w = a[i] - 'A';
  19. if(!AC[p].next[w])
  20. AC[p].next[w] = ++cnt;
  21. p = AC[p].next[w];
  22. }
  23. ++AC[p].num;
  24. }
  25. void build(){
  26. int now;
  27. for(int i = 0; i < 3; ++i)
  28. if(AC[0].next[i])
  29. q.push(AC[0].next[i]);
  30. while(q.size()){
  31. now = q.front(); q.pop();
  32. for(int i = 0; i < 3; ++i)
  33. if(AC[now].next[i]){
  34. AC[AC[now].next[i]].fail = AC[AC[now].fail].next[i];
  35. q.push(AC[now].next[i]);
  36. }
  37. else AC[now].next[i] = AC[AC[now].fail].next[i];
  38. AC[now].num += AC[AC[now].fail].num;
  39. }
  40. }
  41. void dp(){
  42. for(int i = 0; i <= k; ++i)
  43. for(int j = 1; j <= cnt; ++j)
  44. f[i][j] = -2147483647;
  45. for(int i = 1; i <= k; ++i)
  46. for(int j = 0; j <= cnt; ++j){
  47. for(int k = 0; k < 3; ++k)
  48. f[i][AC[j].next[k]] = max(f[i][AC[j].next[k]], f[i - 1][j] + AC[AC[j].next[k]].num);
  49. }
  50. for(int i = 1; i <= cnt; ++i)
  51. ans = max(ans, f[k][i]);
  52. }
  53. int main(){
  54. scanf("%d%d", &n, &k);
  55. for(int i = 1; i <= n; ++i){
  56. scanf("%s", a + 1);
  57. insert();
  58. }
  59. build();
  60. dp();
  61. printf("%d\n", ans);
  62. return 0;
  63. }

【洛谷 P3041】 [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机,dp)的更多相关文章

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

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

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

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

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

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

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

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

  5. [洛谷3041]视频游戏的连击Video Game Combos

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

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

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

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

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

  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

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

随机推荐

  1. (二)Cisco dhcp snooping配置解释

    #配置dhcp snooping相关命令 Switch(config)#ip dhcp snooping  //打开DHCP Snooping功能Switch(config)#ip dhcp snoo ...

  2. sparkUI

    sparkUI 源码: https://www.cnblogs.com/barrenlake/p/4364644.html 页面介绍: https://blog.csdn.net/qq_2763977 ...

  3. MacBook Air装Windows7双系统后的一些(未尝试)想法

    转载请标注原地址:https://www.cnblogs.com/lixiaojing/p/11458477.html 运行环境: macOS在Mojave下的Boot Camp Assistant只 ...

  4. python爬虫 TapTap

    作业要求来自于https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3075 对象 - TapTap TapTap 是一个高品质手游玩家社区, ...

  5. 《The Boost C++ Libraries》 第一章 智能指针

    Boost.SmartPointers中提供了多种智能指针,它们采用在智能指针析构时释放内存的方式,帮助管理动态分配的对象.由于析构函数在智能指针生命周期结束时被执行,所以由它管理的动态分配对象可以保 ...

  6. maven依赖 dependency中scope=compile 和 provided区别

    问题再现 上次这边朋友问我一个问题,就是他们在pom.xml中的dependency中,看到有一些是provided的情况,比如如下: <dependency> <groupId&g ...

  7. Spark2.x(五十六):Queue's AM resource limit exceeded.

    背景: 按照业务需求将数据拆分为60份,启动60个application分别运行对每一份数据,application的提交脚本如下: #/bin/sh #LANG=zh_CN.utf8 #export ...

  8. mysql实现oracle存储过程默认参数

    我们都知道oracle存储过程支持为参数设置默认值,这样即使存储过程升级,原来的调用也可以不受影响.但是mysql不支持,mariadb也没有支持(截止10.4也是如此).但是这一限制会导致升级麻烦重 ...

  9. slot 插槽子组件向父组件传值

    slot 插槽要实现子组件向父组件传值,则需要运用 作用域插槽 1.父组件中用 标签加上 slot-scoped 的属性,属性值随性.(旧版本是scope,vue新版本必须用slot-scope) 2 ...

  10. Android - Button(按钮)的响应点击事件的4种写法

    Button控件setOnclickListener(View.OnClickListener listener)来接收一个点击事件的监听器 自定义一个点击事件监听器类让其实现View.OnClick ...