【题解】[USACO12JAN]视频游戏的连击Video Game Combos
好久没有写博客了,好惭愧啊……虽然这是一道弱题但还是写一下吧。
这道题目的思路应该说是很容易形成:字符串+最大值?自然联想到学过的AC自动机与DP。对于给定的字符串建立出AC自动机,dp状态dp[i][j]则表示第i位(我们求的字符串的第i位),匹配到自动机的第j位所能获得的最大值。只需要沿儿子节点与fail指针转移即可。
#include <bits/stdc++.h>
using namespace std;
#define maxn 1005
int n, m, ans, cnt;
int dp[maxn][maxn], ch[maxn][], tag[maxn * ], fail[maxn * ];
string s; void Gmax(int &x, int y)
{
if(y > x) x = y;
} void Trie_Ins()
{
int len = s.length(), now = ;
for(int i = ; i < len; i ++)
{
if(!ch[now][s[i] - 'A']) ch[now][s[i] - 'A'] = ++ cnt;
now = ch[now][s[i] - 'A'];
}
tag[now] += ;
} void AC_Build()
{
queue <int> q;
for(int i = ; i < ; i ++)
if(ch[][i]) q.push(ch[][i]);
while(!q.empty())
{
int u = q.front(); q.pop();
for(int i = ; i < ; i ++)
{
if(ch[u][i])
{
fail[ch[u][i]] = ch[fail[u]][i];
tag[ch[u][i]] += tag[fail[ch[u][i]]];//注意不是加1哦
q.push(ch[u][i]);
}
else ch[u][i] = ch[fail[u]][i];
}
}
} void DP()
{
dp[][] = ;
for(int i = ; i <= m; i ++)
for(int j = ; j <= cnt; j ++)
{
if(dp[i - ][j] == -) continue;
for(int k = ; k < ; k ++)
{
if(ch[j][k]) Gmax(dp[i][ch[j][k]], dp[i - ][j] + tag[ch[j][k]]);
else Gmax(dp[i][fail[ch[j][k]]], dp[i - ][j] + tag[fail[ch[j][k]]]);
}
}
} int main()
{
scanf("%d%d", &n, &m);
memset(dp, -, sizeof(dp));
for(int i = ; i <= n; i ++)
{
cin >> s;
Trie_Ins();
}
AC_Build();
DP();
for(int i = ; i <= cnt; i ++) ans = max(ans, dp[m][i]);
printf("%d\n", ans);
return ;
}
【题解】[USACO12JAN]视频游戏的连击Video Game Combos的更多相关文章
- [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机+DP)
Description 贝西正在打格斗游戏.游戏里只有三个按键,分别是“A”.“B”和“C”.游戏中有 N 种连击 模式,第 i 种连击模式以字符串 Si 表示,只要贝西的按键中出现了这个字符串,就算 ...
- [Luogu3041][USACO12JAN]视频游戏的连击Video Game Combos
题面 sol 设\(f_{i,j}\)表示填了前\(i\)个字母,在\(AC\)自动机上跑到了节点\(j\)的最大得分.因为匹配需要暴跳\(fail\)所以预先把\(fail\)指针上面的匹配数传下来 ...
- P3041 [USACO12JAN]视频游戏的连击Video Game Combos
思路 简单的AC自动机上dp,暴力跳fail向子节点直接转移即可 代码 #include <cstdio> #include <algorithm> #include < ...
- 【洛谷 P3041】 [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机,dp)
题目链接 手写一下AC自动机(我可没说我之前不是手写的) Trie上dp,每个点的贡献加上所有是他后缀的串的贡献,也就是这个点到根的fail链的和. #include <cstdio> # ...
- 【USACO12JAN】视频游戏的连击Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
- 洛谷P3041 视频游戏的连击Video Game Combos [USACO12JAN] AC自动机+dp
正解:AC自动机+dp 解题报告: 传送门! 算是个比较套路的AC自动机+dp趴,,, 显然就普普通通地设状态,普普通通地转移,大概就f[i][j]:长度为i匹配到j 唯一注意的是,要加上所有子串的贡 ...
- [洛谷3041]视频游戏的连击Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
- P2967 [USACO09DEC]视频游戏的麻烦Video Game Troubles
冲刺阶段的首篇题解! 题目链接:P2967 [USACO09DEC]视频游戏的麻烦Video Game Troubles: 题目概述: 总共N个游戏平台,金额上限V元,给出每个游戏平台的价钱和其上游戏 ...
- 视频游戏的连击 [USACO12JAN](AC自动机+动态规划)
传送门 默认大家都学过trie与AC自动机. 先求出fail,对于每个节点维护一个sum,sum[u]待表从根到u所形成的字符串能拿到几分.显然sum[u]=sum[fail] + (u是几个字符串的 ...
随机推荐
- 14.2 multiprocessing--多线程
本模块提供了多进程进行共同协同工作的功能.由于Python存在GIL锁,对于多线程来说,这只是部分代码可以使用多CPU的优势,对于想全部使用多CPU的性能,让每一个任务都充分地使用CPU,那么使用多进 ...
- python的字典数据类型及常用操作
字典的定义与特性 字典是Python语言中唯一的映射类型. 定义:{key1: value1, key2: value2} 1.键与值用冒号“:”分开: 2.项与项用逗号“,”分开: 特性: 1.ke ...
- vue入门——基本概念
1. 挂载点,模板,实例的关系? 首先附上一个基本demo: <!DOCTYPE html> <html lang="en"> <head> & ...
- Delphi方法
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- Static关键字,遇到的问题_1
一.问题 父类代码: ...
- C语言实例解析精粹学习笔记——34(用“结构”统计学生成绩)
实例34: 设学生信息包括学号.姓名和五门功课的成绩,要求编写输入输出学生信息的函数.在输入学生信息后,以学生成绩的总分从高到低顺序输出学生信息. 思路: 程序引入一个结构数组依次存储输入的学生信息, ...
- HyperLedger Fabric 1.4 超级账本起源(5.1)
至比特币开源以来,无数技术人员对其进行研究,并且对该系统经过了无数次改进,超级账本项目(Hyperledger)最初也是用来改善比特币的底层技术,最终由Linux基金会组织发展起来. 开放 ...
- 【Leetcode】413. Arithmetic Slices
Description A sequence of number is called arithmetic if it consists of at least three elements and ...
- Zookeeper系列(二) Zookeeper配置说明
在配置ZooKeeper配置文件时,有些参数是必需的,有些参数是可选的,这些必需的参数构成了Zookeeper配置文件的最低配置要求,如果需要对ZooKeeper进行更详细的配置,可以 ...
- js 操作表格行数的删减
沉溺了好几个月了,自从年假回来就一直在忙换工作的事情: 新环境.新同事,一如既往的工作, 那么闲话不多说,前两天师妹问我要一个类似于添加和删除的demo:闲暇时间我就参照一些代码写了一下, (发现有错 ...