[USACO12JAN]视频游戏的连击Video Game Combos(AC自动机+DP)
Description
贝西正在打格斗游戏。游戏里只有三个按键,分别是“A”、“B”和“C”。游戏中有 N 种连击 模式,第 i 种连击模式以字符串 Si 表示,只要贝西的按键中出现了这个字符串,就算触发了一次连 击模式。不 同的连击模式是独立计算的,如果几个连击模式同时出现在贝西的按键顺序里,就算有重 叠部分, 也可以同时算作触发了多个模式。
假如有三个连击模式,分别是“AB”,“BA”,“ABC”,而贝西按下了“ABABC”,那么她一共 触发了四次 连击。假设贝西一共可以按 K 次键,那么她最多能触发多少次连击呢?
Solution
将字符串建立AC自动机
用dp[i][j]表示长度为i当前位置在自动机上j号节点上的连击数
mark[i]表示自动机上i号节点包括它的fail树上可获得的连击数
那么dp[i][T[j][k]]=max{dp[i-1][j]+mark[T[i][k]]}
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; int n,m,T[520][4],fail[520],mark[520],tot=1,q[520],f[1010][520],Ans;
char s[20]; void Insert(){
scanf("%s",s);
int now=1,len=strlen(s);
for(int i=0;i<len;++i){
if(!T[now][s[i]-64]) T[now][s[i]-64]=++tot;
now=T[now][s[i]-64];
}
mark[now]++;
} void getfail(){
for(int i=1;i<=3;++i) T[0][i]=1;
int k,now,h=0,t=0;q[++t]=1;
while(h<t){
now=q[++h];
for(int i=1;i<=3;++i)
if(T[now][i]){
k=fail[now];
while(!T[k][i]) k=fail[k];
fail[q[++t]=T[now][i]]=T[k][i];
}else T[now][i]=T[fail[now]][i];
mark[now]+=mark[fail[now]];
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) Insert();
getfail();
memset(f,128,sizeof(f));
f[0][1]=0;
for(int i=1;i<=m;++i)
for(int j=1;j<=tot;++j)
for(int k=1;k<=3;++k)
f[i][T[j][k]]=max(f[i][T[j][k]],f[i-1][j]+mark[T[j][k]]);
for(int i=1;i<=tot;++i) Ans=max(Ans,f[m][i]);
printf("%d\n",Ans);
return 0;
}
[USACO12JAN]视频游戏的连击Video Game Combos(AC自动机+DP)的更多相关文章
- [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 < ...
- 【题解】[USACO12JAN]视频游戏的连击Video Game Combos
好久没有写博客了,好惭愧啊……虽然这是一道弱题但还是写一下吧. 这道题目的思路应该说是很容易形成:字符串+最大值?自然联想到学过的AC自动机与DP.对于给定的字符串建立出AC自动机,dp状态dp[i] ...
- 【洛谷 P3041】 [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机,dp)
题目链接 手写一下AC自动机(我可没说我之前不是手写的) Trie上dp,每个点的贡献加上所有是他后缀的串的贡献,也就是这个点到根的fail链的和. #include <cstdio> # ...
- [洛谷3041]视频游戏的连击Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
- 【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 唯一注意的是,要加上所有子串的贡 ...
- [USACO12Jan][luogu3041] Video Game Combos [AC自动机+dp]
题面 传送门 思路 首先,有一个非常显然的思路就是dp: 设$dp[i][j]$表示前i个字符,最后一个为j 然后发现这个东西有后效性 改!设$dp[i][j]$代表前i个字符,最后15个的状态为j( ...
- P2967 [USACO09DEC]视频游戏的麻烦Video Game Troubles
冲刺阶段的首篇题解! 题目链接:P2967 [USACO09DEC]视频游戏的麻烦Video Game Troubles: 题目概述: 总共N个游戏平台,金额上限V元,给出每个游戏平台的价钱和其上游戏 ...
随机推荐
- 在CentOS上配置MySQL服务
#!/bin/sh # Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB # Thi ...
- 零基础逆向工程37_Win32_11_事件_线程同步
1 内核对象 前面已经学过线程和互斥体两个内核对象.此节讲了事件这个内核对象.前面提出了内核对象这个概念,可能不太清晰,简单来说内核对象就是系统层的东西. 1.1 小结内核对象: 进程.线程.事件.互 ...
- php支付走过的坑(微信篇 包含h5支付和app支付 注册 秘钥 环境等等配置)
支付这东西,说容易也容易,说难也难 代码这玩意还比较好说 但是 如果没有demo 直接去看官方文档 十有八九一脸懵逼 今天就整理一下 支付这块走过的坑 涉及 微信h5支付 支付宝h5支付 (api文档 ...
- HTML文本格式化用法
1.HTML 文本格式化标签 标签 描述 <b> 定义粗体文本 <em> 定义着重文字,显示为斜体 <i> 定义斜体字 <small> 定义小号字 &l ...
- Android Studio 导入 AOSP 源码
有了 AOSP 源码,接下来就是如何看了,可以直接文本看,可以用 Source Insight,我当然选择 Android Studio,Android Studio 是我熟悉且十分强大的工具.问题来 ...
- 【Microsoft Azure学习之旅】测试消息队列(Service Bus Queue)是否会丢消息
组里最近遇到一个问题,微软的Azure Service Bus Queue是否可靠?是否会出现丢失消息的情况? 具体缘由如下, 由于开发的产品是SaaS产品,为防止消息丢失,跨Module消息传递使用 ...
- Struts2_Namespace
namespace 决定了action的访问路径,默认为"",可以接收所有路径的action,当精确的index.action处理不了的时候,就会找到这个action;namesp ...
- python-rrdtool
https://nagios-plugins.org/doc/guidelines.html nagios检测信息 host GPING OK – rtt min/avg/max/mdev = 0.8 ...
- 用户管理的设计--3.jquery的ajax实现二级联动
页面效果 实现步骤 1.引入struts整合json的插件包 2.页面使用jquery的ajax调用二级联动的js //ajax的二级联动,使用选择的所属单位,查询该所属单位下对应的单位名称列表 fu ...
- 2017.10.1 JDBC数据库访问技术
4.1 JDBC技术简介 4.1.1 定义 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的 java API,由一组类与接口组成,通过 ...