Video Games G:弱智紫题,30min 切了,dp 思路非常板。

多模式串一看肯定就是要建出 AC 自动机,然后在 fail 树里下传标记,预处理每个节点到达后的得分。

然后设计 \(dp_{i,j}\) 表示第 \(i\) 个字符,AC 自动机里匹配节点在 \(j\) 的最大答案,刷表法转移即可:

\[dp_{i+1,ch_{j,c}} \gets \max(dp_{i+1,ch_{j,c}},dp_{i,j}+con_{ch_{j,c}})
\]

时间复杂度 \(O(nk\left|S\right|)\)。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
int n,m;
int ch[305][5],idx=0,ne[305],tot[305],dp[1005][305],ans=0;
char s[20];
vector<int>g[305];
void insert(char *s)
{
int p=0;
for(int i=1;s[i];i++)
{
int c=s[i]-'A';
if(ch[p][c]==0)ch[p][c]=++idx;
p=ch[p][c];
}
tot[p]++;
}
void build()
{
queue<int>q;
for(int i=0;i<3;i++)
{
if(ch[0][i])q.push(ch[0][i]);
}
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<3;i++)
{
int v=ch[u][i];
if(v)ne[v]=ch[ne[u]][i],q.push(v);
else ch[u][i]=ch[ne[u]][i];
}
}
}
void dfs1(int u)
{
for(auto v:g[u])
{
tot[v]+=tot[u];
dfs1(v);
}
}
void init()
{
for(int i=1;i<=idx;i++)g[ne[i]].push_back(i);
dfs1(0);
}
int main()
{
//freopen("sample.in","r",stdin);
//freopen("sample.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s+1;
insert(s);
}
build();
init();
memset(dp,-0x3f,sizeof(dp));
dp[0][0]=0;
for(int lv=0;lv<m;lv++)
{
for(int p=0;p<=idx;p++)
{
for(int i=0;i<3;i++)
{
int v=ch[p][i];
dp[lv+1][v]=max(dp[lv+1][v],dp[lv][p]+tot[v]);
}
}
}
for(int i=0;i<=idx;i++)ans=max(ans,dp[m][i]);
cout<<ans;
return 0;
}

Luogu P3041 USACO12JAN Video Game G 题解 [ 紫 ] [ AC 自动机 ] [ 动态规划 ]的更多相关文章

  1. 落谷P3041 [USACO12JAN]Video Game G

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

  2. 【JSOI2007】文本生成器 题解(AC自动机+动态规划)

    题目链接 题目大意:给定$n$个子串,要求构造一个长度为$m$的母串使得至少有一个子串是其子串.问方案数. ------------------------ 我们可以对要求进行转化:求出不合法的方案数 ...

  3. 2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机)

    2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机) https://w ...

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

  5. 【题解】AC自动机题解合集

    最近貌似大家都在搞字符串?很长一段时间都没有写博客了……还是补一补坑吧. 感觉AC自动机真的非常优美了,通过在trie树上建立fail指针可以轻松解决多模匹配的问题.实际上在AC自动机上的匹配可以看做 ...

  6. CF 1400F x-prime Substrings 题解【AC自动机+DP】

    CF 1400F.x-prime Substrings 题意: 给定一个由\('1'\)到\('9'\)组成的字符串\(s\)和一个数\(x\),定义一个串为\(x-prime\)串,当且仅当这个串上 ...

  7. 【题解】[USACO12JAN]Video Game G

    第一道\(AC\)自动机\(+DP.\) 首先,一个自动机上\(DP\)的套路是设\(dp[i][j]\)表示长度为\(i\)匹配到\(j\)节点的最优得分. 那么,由于我们已经建好了\(Trie\) ...

  8. CF G. Indie Album AC自动机+fail树+线段树

    这个套路挺有意思的. 把 $trie$ 和 $fail$ 树都建出来,然后一起跑一跑就好了~ #include <queue> #include <cstdio> #inclu ...

  9. bzoj3940 censoring 题解(AC自动机)

    题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...

  10. 视频游戏的连击 [USACO12JAN](AC自动机+动态规划)

    传送门 默认大家都学过trie与AC自动机. 先求出fail,对于每个节点维护一个sum,sum[u]待表从根到u所形成的字符串能拿到几分.显然sum[u]=sum[fail] + (u是几个字符串的 ...

随机推荐

  1. golang之jwt

    golang-jwt是go语言中用来生成和解析jwt的一个第三方库.本文中使用目前最新的v5版本. 安装 go get -u github.com/golang-jwt/jwt/v5 在代码中引用 i ...

  2. linux模拟HID USB设备及wireshark USB抓包配置

    目录 1. 内核配置 2. 设备配置 附 wireshark USB抓包配置 笔者开发USB设备时的一些记录 1. 内核配置 内核启用USB Gadget,使用fs配置usb device信息. De ...

  3. Winform窗体控件双向绑定数据模拟读写PLC数据

    1.用Modbus工具模拟PLC 2.创建一个实体类 点击查看代码 internal class Data : INotifyPropertyChanged { ushort[] ushorts = ...

  4. .NET 使用 ZXing.Net 生成二维码,并识别

    .NET 使用 ZXing.Net 生成二维码,并识别 前言 前面已经分享给很多创建二维码,条形码...等一系列的方式 各有优缺点,暂时不做评价.今天推荐ZXing.Net .也是比较全面的一种方式, ...

  5. Web API 控制器的行为和操作方法的属性

    ControllerBase 类 Web API 包含一个或多个派生自 ControllerBase 的控制器类. Web API 项目模板提供了一个入门版控制器 [ApiController] [R ...

  6. 一款可以完整保留排版的PDF翻译,GitHub增长第一

    最近看论文较多,顺手给大家推荐一个用下来觉得不错的开源PDF翻译工具:PDFMathTranslate 目前这款开源项目在GitHub上已经收获了7.6K Star,而且由于一直处于增长趋势榜第一的位 ...

  7. [转]关于Visual Studio:如何使用cmake检测64位MSVC?

    1.如何使用 cmake 检测 64 位 MSVC? 2.关于Visual Studio:如何使用cmake检测64位MSVC?

  8. Ant入门简单实例

    一.构建ant环境 要使用ant首先要构建一个ant环境,步骤很简单: 1) 安装jdk,设置JAVA_HOME ,PATH ,CLASS_PATH(这些应该是看这篇文章的人应该知道的) 2) 下载a ...

  9. [转]Microsoft Robotics Studio:微软仿真机器人集成开发环境,简称MSRS

    原文链接:Microsoft Robotics Studio 微软官网:Robotics: Simulating the World with Microsoft Robotics Studio 其它 ...

  10. 即时通讯安全篇(十):IM聊天系统安全手段之通信连接层加密技术

    本文由融云技术团队分享,原题"互联网通信安全之端到端加密技术",内容有修订和改动. 1.引言 随着移动互联网的普及,IM即时通讯类应用几乎替代了传统运营商的电话.短信等功能.得益于 ...