首页 > 其他分享 >2023.12.30做题纪要

2023.12.30做题纪要

时间:2023-12-30 14:44:56浏览次数:32  
标签:int 2023.12 30 length 做题 child link newP MAXN

SAM 模板

评价:逆天纸糊串,学不会一点。

#include <bits/stdc++.h>

const int MAXN = 3e6 + 100;

int N;
char ch[MAXN];
long long answer;

class Suffix_Automaton {
private:
    int tot, last, root;
    int child[MAXN][26], link[MAXN], length[MAXN];
    long long cnt[MAXN];
public:
    Suffix_Automaton() {
        root = tot = last = 1;
    }

    void Insert(int c) {
        int p = last, newP = ++ tot;
        last = newP;
        length[newP] = length[p] + 1;
        cnt[newP] = 1;

        while (p && !child[p][c]) {
            child[p][c] = newP;
            p = link[p];
        }
        // std::cout << p << '\n';
        if (!p) {
            link[newP] = root;
        }
        else {
            int q = child[p][c];
            if (length[q] == length[p] + 1) {
                link[newP] = q;
            }
            else {
                int newQ = ++ tot;
                memcpy(child[newQ], child[q], sizeof child[q]);
                link[newQ] = link[q];
                link[q] = link[newP] = newQ;
                length[newQ] = length[p] + 1;

                while (p && child[p][c] == q) {
                    child[p][c] = newQ;
                    p = link[p];
                }
            }
        }
    }

    std::vector<int> son[MAXN];
    void Build() {
        for (int i = 1; i <= tot; ++ i) {
            son[link[i]].emplace_back(i);
            // std::cout << link[i] << ' ';
        }
        // std::cout << '\n';
    }

    void Dfs(int now) {
        for (const int &iter: son[now]) {
            Dfs(iter);
            cnt[now] += cnt[iter];
        }
        if (cnt[now] != 1) {
            answer = std::max(answer, length[now] * cnt[now]);
        }
    }
}sam;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);

    std::cin >> (ch + 1);
    int N = strlen(ch + 1);
    for (int i = 1; i <= N; ++ i)
        sam.Insert(ch[i] - 'a');
    sam.Build();
    sam.Dfs(1);
    std::cout << answer << '\n';

    return 0;
}

生成魔咒

\(SAM\) 板子题,每个节点表示的都是不同的子串,每次新加一个节点就统计一次答案就行了,用后缀树上每个节点的最长长度减去最小长度就行。

用 \(Max(b) = Min(a) - 1\) 来求每个节点的最小长度。

#include <bits/stdc++.h>

const int MAXN = 3e5 + 10;

int N;
int a[MAXN];
long long answer;

class Suffix_Automaton {
private:
    int tot, last, root;
    std::unordered_map<int, int> child[MAXN];
    int link[MAXN];
    long long length[MAXN];
public:
    Suffix_Automaton() {
        root = tot = last = 1;
    }

    void Insert(int c) {
        int p = last, newP = ++ tot;
        last = newP;
        length[newP] = length[p] + 1;

        while (p && !child[p][c]) {
            child[p][c] = newP;
            p = link[p];
        }

        if (!p) {
            link[newP] = root;
        }
        else {
            int q = child[p][c];
            if (length[q] == length[p] + 1) {
                link[newP] = q;
            }
            else {
                int newQ = ++ tot;
                child[newQ] = child[q]; 
                link[newQ] = link[q];
                link[q] = link[newP] = newQ;
                length[newQ] = length[p] + 1;

                while (p && child[p][c] == q) {
                    child[p][c] = newQ;
                    p = link[p];
                }
            }
        }

        answer += (length[newP] - length[link[newP]]);
    }
}sam;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);

    std::cin >> N;
    for (int i = 1, temp; i <= N; ++ i) {
        std::cin >> temp;
        sam.Insert(temp);
        std::cout << answer << '\n';
    }
}

标签:int,2023.12,30,length,做题,child,link,newP,MAXN
From: https://www.cnblogs.com/jueqingfeng/p/17936343.html

相关文章

  • 2023-12-30 训练总结
    返回C组做题,然后发现自己挂分了。T1寻找道路[NOIP2014提高组]寻找道路题目背景NOIP2014提高组D2T2题目描述在有向图\(G\)中,每条边的长度均为\(1\),现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:路径上的所有点的出边所指向的点都直接......
  • 【2023.12.30】PVE的PCIE直通改VGPU授权
    之前使用直通有个坏处,就是其他的CT和虚拟机用不了GPU,只能使用核显在这里参考的链接是https://gitlab.com/polloloco/vgpu-proxmoxaptupdateaptdist-upgradeaptinstall-ygitbuild-essentialdkmspve-headersmdevctlgitclonehttps://gitlab.com/polloloco/vgpu-prox......
  • 2023.12.30 日记
    早上跑400m,低血糖。跑完我在操场上呕吐,四肢麻木地瘫在草地。我无力了。脸部传来瘙痒。痒觉移动到了耳梢。它在耳朵旁转了几圈,大抵由于那个洞深不可测,便放弃了,继续在我身上爬行。我感受到飞蝇在我的睫毛上晃动。我伸起手扇它,它没飞走。我也没有伸起手。四肢从冰冷麻木转向......
  • 伪纪实文学《中日夏令营的较量》是如何毒害青年30年的
    一个叫孙云晓的人在30年前写了一篇伪纪实文学,大势鼓吹日本青年优于中国青年,并得到中国永远无法在国家发展上超过日本的这种结论。而这个孙云晓完全是靠着胡乱编造和片面描述所得到的结论,这个流毒甚广的伪纪实文学目的就是为了搞出击碎人们价值观的结论,搞出重大的社会和国家的关注,......
  • 2023-12-30
    2023-12-30尝试了一下实现中间件,运行那块的函数是请教chatGPT[1]得到的,自己之前想的一团乱麻,结果如此简洁。//最小中间件实现//存储所有中间件letmiddlewares:middlewares[]=[]typehandel=typeofhandel//对于纯函数而言,参数就是他的上下文typemiddlewares......
  • 【2023.12.29】修复服务器小记录,重装Proxmox
    半年没碰服务器了,没想到还是挂了,卡在BIOS过不去NUC因为没有主板电池,所以还特地找了下怎么重置,没想到是拔出主板上的黄色保护器,使两个针脚空接和我想象中的不太一样,照理来说应该是针脚对接,才能重置才对因为这样子的话,这个黄色保护套就不能随意丢弃了,感觉这个主板的设计有问题折......
  • 30 RS485串口程序收发环路设计
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述在前面的课程中,我们已经学习了UART串口程序的设计,在工业场合为了提高串口的抗干扰能力,以及传输距离,RS4......
  • [CF30E] Tricky and Clever Password 题解
    [CF30E]TrickyandCleverPassword题解注意到一个合法字符串首尾相同,考虑用S的反转和S跑KMP。对于只有一个串,暴力manacher即可。匹配到某一位置\((i,j)\)时,查询区间最长的奇回文串长度,用二分+ST表解决,因为回文串不能超过区间长度。//Problem:TrickyandCle......
  • 30.Cypress测试框架介绍
    目录 cypress简介cypress与selenium对比cypress环境部署cypress框架基本用法cypress简介 基于JavaScript的前端测试工具可以对浏览器中运行的任何内容进行快速、简单、可靠的测试对每一步操作都支持回看覆盖了测试金字塔模型的所有测试类型【界面测试,集......
  • 2023.12.29日报
    首先要说,date类型敲的多了写标题格式的时候都写成了(2023-12-29(笑)),今天基本上完成了财务的业务流程在整个开发过程中充斥着各种各样的问题,其实到最后也不是很明白,今天主要是对昨天完成的内容做了一个细化,主要是突然意识到自己核算工资的方式实在是过于粗暴了,像极了挂电线杆的那类......