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

2023.12.31做题纪要

时间:2023-12-31 10:55:07浏览次数:44  
标签:int 2023.12 31 length 做题 child link MAXN newP

TJOI2015 弦论

身为彩笔的我觉得这道题还不错???对于新学的我来说挺考验对 \(SAM\) 的理解??

要用一个类似洛谷 \(SAM\) 板子题的数组来记录每个节点的 \(right(endpos)\) 集合的大小。

最后维护一下就行了。主要难在证明。

晴天
#include <bits/stdc++.h>

const int MAXN = 3 * (5e5 + 100);

int N, T, K;
char ch[MAXN];

class Suffix_Automaton {
public:
    int repeat[MAXN];
private:
    void Insert(int c) {
        int p = last, newP = ++ tot;
        last = newP; 
        length[newP] = length[p] + 1;
        repeat[newP] = 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;
                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];
                }
            }
        }
    }

public:
    char string[MAXN];
    int tot, last, root;
    int child[MAXN][27], link[MAXN], length[MAXN];
    int count[MAXN];

    Suffix_Automaton() {
        root = tot = last = 1;
    }

    void Treat() {
        int N = strlen(string + 1);
        for (int i = 1; i <= N; ++ i)
            Insert(string[i] - 'a' + 1);
    }

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

    void Dfs(int now) {
        for (const int &iter: son[now]) {
            Dfs(iter);
            repeat[now] += repeat[iter];
        }
    }
}sam;

bool visit[MAXN];

int Dfs(int now) {
    if (visit[now]) 
        return sam.count[now];
    if (T == 0)
        sam.repeat[now] = 1;
    sam.count[now] = sam.repeat[now];
    visit[now] = true;
    for (int i = 1; i <= 26; ++ i) {
        if (!sam.child[now][i])
            continue;
        sam.count[now] += Dfs(sam.child[now][i]);
    }
    return sam.count[now];
}

std::vector<char> answer;

void GetAnswer(int now, int rest) {
    rest -= sam.repeat[now];
    if (rest == 0)
        return;
    for (int i = 1; i <= 26; ++ i) {
        int to = sam.child[now][i];
        if (!to)
            continue;
        if (rest - sam.count[to] <= 0) {
            answer.emplace_back('a' + i - 1);
            GetAnswer(to, rest);
            return;
        }
        rest -= sam.count[to];
    }
}

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

    std::cin >> (sam.string + 1);
    std::cin >> T >> K;

    sam.Treat();
    if (T == 1) {
        sam.Build();
        sam.Dfs(1);
    }
    Dfs(1);
    GetAnswer(1, K + sam.repeat[1]);
    if (!answer.size()) {
        std::cout << -1 << '\n';
        return 0;
    }
    for (const char &iter: answer)
        std::cout << iter;
    std::cout << '\n';
    return 0;
}

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

相关文章

  • 2023-2024-1 20231412 《计算机基础与程序设计》第14周学习总结
    2023-2024-120231412《计算机基础与程序设计》第14周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP这个作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13011这个作业的目标《C......
  • 2023-2024-1 20231405《计算机基础与程序设计》第十四周学习总结
    2023-2024-120231405《计算机基础与程序设计》第十四周学习总结作业信息作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13009作业的目标自......
  • 2023-2024 20231302《计算机基础与程序设计》第十四周学习总结
    作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十四周作业这个作业的目标自学教材《C语言程序设计》第13章并完成云班课测试作业正文https://www.cnblogs.com/9q2z2z/p/17937248教材......
  • 2023-2024-1 20231320 《计算机基础与程序设计》第十四周学习总结
    2023-2024-120231320《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第十四周作业)这个作业的目标<自学《C语言程序......
  • 2023-2024-1 学号:20231305 《计算机基础与程序设计》第十四周学习总结
    2023-2024-1学号:20231305《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标<自学教材......
  • 2023.12 《卓有成效的管理者》-彼得▪德鲁克
    目录主要内容第1章有效是可以学会的第2章认识你的时间第3章我能做出什么贡献第3章主要内容第1章有效是可以学会的第2章认识你的时间第3章我能做出什么贡献第3章......
  • 2023.12.30模拟赛总结
    前言:这次比赛打的不是很好,100pts,rank8T1赛时想到了正解,但是因为一些题面的原因和代码细节没调出来首先可以写出暴力dp:\(f[i][j]\)表示到第i位,选了i且选了j个哨岗的最大范围枚举k为上一个,直接暴力转移是\(O(n^3)\)的,过不去然后,我们发现可以分类讨论,如果\([l_i,r_i]\)和\([l_k......
  • 2023-2024-1 20231406 《计算机基础与程序设计》第十四周学习总结
    2023-2024-120231406《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十四周作业这个作业的目标自学《C语言程序设计》第13章并完成云班课测试......
  • *035共情营邱月帮-第17次课(周六晚上-AB对练-)-20231230
      20221212--20221230期间每周一、四、五上正课,三、六是对答疑、对练课。 打开心灵,改变从自己开始,一起抱团取暖。《相信相信的力量》----------------------------------------------------------------------------------------------------------------(周六)-202312......
  • 学期2023-2024-1 20231417 《计算机基础与程序设计》第十四周学习总结
    学期2023-2024-120231417《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十四周作业这个作业的目标《C语言程序设计》第13章并完成云班课测试作......