首页 > 其他分享 >P3041 [USACO12JAN] Video Game G 题解 AC自动机

P3041 [USACO12JAN] Video Game G 题解 AC自动机

时间:2024-07-21 18:27:55浏览次数:12  
标签:AC end val int 题解 tr Pig P3041 fail

本题是一道 AC 自动机上的 dp。
首先不难想到状态定义 f(i,j) 表示仅考虑前 i 个位置,第 i 个字符是 j 的分数,但无法转移,所以考虑将 j 这一维转化为表示 AC 自动机上的点。

再定义 val(i) 表示以 i 结尾的所有技能种数,则转移方程为 f(i,j)=max(f(i,j),f(i-1,father(j)+val(j))。

现在问题转化为求 val。求 val 的话在求 AC 自动机的 fail 指针那部分里来求,转移式为 val(i)=end(i)+val(fail(i)),其中 end(i) 表示以 i 结尾的字符串数。

代码:

#include <bits/stdc++.h>
using namespace std;
const int Pig = 1e3 + 10;
int f[Pig][Pig];
struct ac_automaton{
    int tr[Pig][4], end_[Pig], fail[Pig], cnt = 0, val[Pig];
    ac_automaton() {
        memset(tr, 0, sizeof(tr));
        memset(end_, 0, sizeof(end_));
        memset(val, 0, sizeof(val));
        memset(fail, 0, sizeof(fail));
    }
    void insert(string n) {
        int p = 0;
        for (auto v : n) {
            if (!tr[p][v - 'A'])
                tr[p][v - 'A'] = ++cnt;
            p = tr[p][v - 'A'];
        }
        end_[p]++;
    }
    void build() {
        queue<int> q;
        for (int i = 0; i < 3; i++) {
            if (tr[0][i])
                q.emplace(tr[0][i]);
        }
        while (!q.empty()) {
            int p = q.front();
            q.pop();
            for (int i = 0; i < 3; i++) {
                if (tr[p][i]) {
                    fail[tr[p][i]] = tr[fail[p]][i];
                    q.push(tr[p][i]);
                } else {
                    tr[p][i] = tr[fail[p]][i];
                }
            }
            val[p] = end_[p] + val[fail[p]];
        }
    }
};
ac_automaton tr;
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        string cur;
        cin >> cur;
        tr.insert(cur);
    }
    tr.build();
    memset(f, -0x3f3f3f3f, sizeof(f));
    for (int i = 0; i <= k; i++)
        f[i][0] = 0;
    int ans = 0;
    for (int i = 1; i <= k; i++) {
        for (int j = 0; j <= tr.cnt; j++) {
            for (int l = 0; l < 3; l++) {
                f[i][tr.tr[j][l]] = max(f[i][tr.tr[j][l]], f[i - 1][j] + tr.val[tr.tr[j][l]]);
            }
        }
    }
    for (int i = 0; i <= tr.cnt; i++)
        ans = max(ans, f[k][i]);
    cout << ans;
    return 0;
}

标签:AC,end,val,int,题解,tr,Pig,P3041,fail
From: https://blog.csdn.net/iPig4/article/details/140579259

相关文章

  • Loj P10064 黑暗城堡 题解 最短路径树记数
    这道题是一道最短路径树问题。首先,什么是最短路径树呢?定义一个图的最短路径树表示一个图上的生成树,且根节点到图上任一点的距离等于原图上两者之间的距离。而不难发现,题目其实是在求图上最短路径树记数。首先,建出最短路径树。枚举每条边,判断边两个端点到根的距离之差是否为......
  • 【题解】P4648 [IOI2007] pairs 动物对数
    Problem给定模板\(B(1\leB\le3)\),代表\(B\)维空间。其中有\(n\)个点,给出坐标与坐标上限\(M\),求\(n\)个点中曼哈顿距离\(\leD\)的对数。Solve\(B=1\)考虑将问题化简成:求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^{i-1}[dis(i,j)\leqD]\)。其中\(dis(i,j)\)......
  • Activity介绍(一)
    Activity是什么Activity类是Android应用的关键组件,而activity的启动和组合方式是平台应用模型的基本组成部分。与使用main()方法启动应用的编程范式不同,Android系统会通过调用与其生命周期特定阶段对应的特定回调方法,在Activity实例中启动代码。Activity生命周期当用......
  • 暑期ACM-Week1(7.15-7.21)
    文章目录知识点基础程序设计技巧万能[头文件](#C++中的输入输出)while执行多次输入循环退出scanf,printf&cin,coutint初定义开数组一般大小:布尔型(bool)基本数据类型取值范围文件输入输出操作浮点数陷阱C++中的输入输出递归案例1:设计一个求阶乘的递归函数案例2:设计一个......
  • 圆方树学习笔记 & 最短路 题解
    前言圆方树学习笔记,从一道例题讲起。题目链接:Hydro&bzoj。题意简述仙人掌上求两点距离。题目分析为了把仙人掌的性质发挥出来,考虑将其变成一棵树。圆方树就是这样转换的工具。先讲讲圆方树的概念:原图上的点为圆点,每个点双对应一个方点,树边都是方点连向点双内的圆点。具......
  • 黑苹果macOS系统U盘版/恢复版基础安装教程
    因分为两种安装方式,本文主要介绍两种安装方式:U盘安装,以及在Windows下使用镜像恢复软件安装的方式。本文的操作方法支持Windows和macOS分别使用不同硬盘的安装方法。如果要安装成单个硬盘多系统的方式,注意你的分区结构。两种方法列举如下(OpenCore同样适用): U盘安装法:16GU......
  • 跑步爱天天 题解
    题意简述一棵以\(1\)为根的树,儿子间有先后顺序。初始每个结点上有一个警卫,警卫按照深度优先遍历其子树,儿子间的先后顺序体现在这里,回到起始点后开始新一轮的遍历。yzh想要从\(S\)走到\(1\),请问她会在路上遇到多少警卫(\(S\)点的也算)。题目分析法\(1\)先来讲一讲我考场......
  • 苹果系统注入三码,避免封号,解锁iCloud/FaceTime/iMessage/随航!
    黑苹果遇到的问题多种多样,这是一篇比较简单直接的、适合大部分配置的教程,如果解决不了你的问题,请见谅。如果完成三码注入后iMessage和FaceTime仍不能正常工作,需要考虑主板NVRAM支持问题。随航功能(Sidecar)仅支持macOSCatalina及以上,基本开启要求参阅官网,其中特别需要说明的......
  • 五类字体serif,sans-serif,monospace,cursive和fantasy
    引用:https://www.cnblogs.com/shangsi/articles/12212792.html 一.示例generic-font-familiesP.S.更多英文字体示例见参考资料-五种一般字体族英文示例P.S.更多中文字体示例见参考资料-TheCompleteBeginner’sGuidetoChineseFonts二.作用Genericfontfamilies......
  • 题解:Codeforces Round 960 (Div. 2) D
    D.GridPuzzletimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputYouaregivenanarray\(a\)ofsize\(n\).Thereisan\(n\timesn\)grid.Inthe\(i\)-throw,thefirst\(a_i\)......