第一道\(AC\)自动机\(+DP.\)

首先,一个自动机上\(DP\)的套路是设\(dp[i][j]\)表示长度为\(i\)匹配到\(j\)节点的最优得分。

那么,由于我们已经建好了\(Trie\)图,我们就应该提前把走到节点\(j\)的所有连击操作处理出来。

有一条显然结论:如果在\(fail\)树上经过了这个串结尾节点中子树中的任意一点,则这次匹配一定会包含这个串。

换句话说,我们在对每一个节点更新\(fail\)的时候,其分值应该直接把其\(fail\)的分值加上。

于是我们进行\(dp.\)

首先初始值都是\(-inf,\)但对于匹配节点在根的情况应该是\(0.\)

至于为什么\(dp[0][*]\)不能赋值为\(0,\)是因为根本不可能存在这种状态。匹配长度为\(0\)不可能匹配到其他节点。

但初始时,不管哪一个节点和\(0\)匹配,其一定不会有任何分数。根节点本身是一个空节点。

解决初始值问题,我们可以进行\(dp.\)

枚举长度,枚举节点,再枚举字符。对于一个状态,我们应该取所有能到达这个状态的\(dp\)值的\(\max.\)因为我只能输入\(k\)个字符。

剩下的就是模板了。

#include<bits/stdc++.h>
using namespace std;
int dp[5000][2000];
const int MAXN=4000;
int pos[MAXN],cnt[MAXN];
int tot,n;
char st[MAXN];
struct Tree{
int ch[3],fail;
}T[MAXN];
vector<int>to[MAXN];
int num[MAXN];
int insert(char *str,int len){
int u=0;
for(int i=0;i<len;++i){
int x=str[i]-'A';
if(!T[u].ch[x])T[u].ch[x]=++tot;
u=T[u].ch[x];
}
num[u]++;return u;
}
void bfs(){
queue<int>q;
for(int i=0;i<3;++i){
if(T[0].ch[i]){
int v=T[0].ch[i];
T[v].fail=0;
q.push(v);
}
}
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<3;++i){
if(T[u].ch[i]){
int v=T[u].ch[i];
T[v].fail=T[T[u].fail].ch[i];
q.push(v);
}
else T[u].ch[i]=T[T[u].fail].ch[i];
}
to[T[u].fail].push_back(u);
num[u]+=num[T[u].fail];
}
}
int K; int main(){
scanf("%d%d",&n,&K);
for(int i=1;i<=n;++i){
scanf("%s",st);
int L=strlen(st);
pos[i]=insert(st,L);
}
bfs();
memset(dp,128,sizeof(dp));
for(int i=0;i<=K;++i)dp[i][0]=0;
for(int i=1;i<=K;++i){
for(int j=0;j<=tot;++j){
for(int k=0;k<3;++k){
dp[i][T[j].ch[k]]=max(dp[i][T[j].ch[k]],dp[i-1][j]+num[T[j].ch[k]]);
}
}
}
int ans=0;
for(int i=0;i<=tot;++i)ans=max(ans,dp[K][i]);
printf("%d\n",ans);
return 0;
}

【题解】[USACO12JAN]Video Game G的更多相关文章

  1. 落谷P3041 [USACO12JAN]Video Game G

    题目链接 多模式匹配问题,先建 AC 自动机. 套路性的搞个 DP: \(f[i][j]\) 表示前 \(i\) 个字符,当前在 \(AC\) 自动机上的节点是 \(j\) 能匹配到的最多分. 初始化 ...

  2. ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)

     目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...

  3. 洛谷 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 ...

  4. [USACO12JAN]Video Game Combos

    AC自动机建立fail树后树上DP # include <stdio.h> # include <stdlib.h> # include <iostream> # ...

  5. 【题解】[USACO07OPEN]Dining G

    \(Link\) \(\text{Solution:}\) 这一题,我们要做到,食物和牛.牛和饮料均为一对一的关系.我们发现这个图不好建立. 经典技巧:将牛拆边,拆成入点和出点,并连容量为\(1\)的 ...

  6. 【题解】[USACO07NOV]Sunscreen G

    \(Link\) \(\text{Solution:}\) 把奶牛的忍耐度转化为线段,则题目转化为选择一些点使得覆盖的线段尽可能多.一个点只能覆盖一条线段. 考虑将点按照位置排序,线段按照右端点排序. ...

  7. [题解] [USACO05JAN]Muddy Fields G

    题目TP门 题目大意 在一个 \(R×C\) 的矩阵中,每个点有两个状态:草地和泥地.你需要在泥地里铺 \(1×k\) 木块, \(k\) 为任意整数,求最少要多少木块. 思路 两个横向木块不会互相干 ...

  8. AC 自动机学习笔记

    虽然 NOIp 原地爆炸了,目前进入 AFO 状态,但感觉省选还是要冲一把,所以现在又来开始颓字符串辣 首先先复习一个很早很早就学过但忘记的算法--自动 AC AC自动机. AC 自动机能够在 \(\ ...

  9. 【BZOJ】2277: [Poi2011]Strongbox

    题意 有一个密码箱,\(0\)到\(n-1\)中的某些整数是它的密码.如果\(a\)和\(b\)都是它的密码,那么\((a+b)%n\)也是它的密码(\(a,b\)可以相等).某人试了\(k\)次密码 ...

随机推荐

  1. 序列号,IMEI,IMSI,ICCID的含义

    什么是序列号? 序列号是一串标识你手机出生证明以及身材特征的信息,甚至还可用来识别是否为官方翻新机.你可以简单的将这一串数字分割为:aabccdddeef 的形式.拿iPhone 4为例 aa = 工 ...

  2. 【转】对初学LoadRunner朋友的建议

    对初学LoadRunner朋友的建议 作者:wind摘要:随着Internet的普及与迅速发展,企业业务量的迅速加大,数据大集中成为一种趋势,IT系统承载的负荷越来越重,系统性能的好坏严重的影响了企业 ...

  3. 轻轻松松学CSS:媒体查询

    轻轻松松学CSS:利用媒体查询创建响应式布局 媒体查询,针对不同的媒体类型定制不同的样式规则.在网站开发中,可以创建响应式布局. 一.初步认识媒体查询在响应式布局中的应用 下面实例在屏幕可视窗口尺寸大 ...

  4. IIS上传文件最大限制问题

    IIS服务器文件最大限制默认是30M. 自定义方法:修改配置文件,路径是:C:\Windows\System32\inetsrv\Config\applicationHost.config 在requ ...

  5. MyBatis开发重点知识

    1.1为什么需要ORM框架? 传统的JDBC编程存在的弊端: ü 工作量大,操作数据库至少要5步: ü 业务代码和技术代码耦合: ü 连接资源手动关闭,带来了隐患: MyBatis前身是iBatis, ...

  6. java 将map转为实体类

    使用反射将map转为对象,如果不使用反射的话需要一个get一个set写起来麻烦,并且不通用,所以写了一个通用的方法将map集合转为对象,直接看代码,注释也都挺清楚的 public static < ...

  7. Vue的属性、事件、插槽

    属性 自定义属性props ->组件的propos中声明的属性 原生属性attrs ->没有声明属性,默认自动挂载在组件的根元素上,inheritAttrs可以关闭自动挂载 特殊属性cla ...

  8. leetcode刷题-57插入区间

    题目 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入:intervals = ...

  9. vueJs 安装

    1.下载nodeJs 可前往 https://www.cnblogs.com/takeyblogs/p/13600124.html 这里下载 2.由于 npm 安装速度慢,本教程使用了淘宝的镜像及其命 ...

  10. python基础:内置函数zip,map,filter

    一.zip zip,就是把俩list,合并到一起,如果想同时循环2个list的时候,可以用zip,会帮你轮流循环两个list 比如: l1=[1,2,3,4,5] l2=['a','b','c','d ...