传送门

\(\color{green}{solution}\)

在开这道题之前建议先看看3756:pty的字符串,然后你会发现这题就很zz了.
当然,作为一名合格的博主,我还是应该写点什么的

首先,我们要清楚广义后缀自动机不是什么高大上的东西,就是普通的后缀自动机建完一个串后
把\(last\)的值赋为\(root\)建下一个串...(然而我搞了一星期才搞懂).
然后这是一棵数,在树上建后缀自动机的话就把当前节点作为\(last\),然后把子节点正常插入即可
于是这道题就变成了[TJOI2015]弦论
剩下的就是一堆的细节问题,比如他让你求的是本质不同的第\(K\)大,然后空串要算一个单独的串.
最为重点的细节是不要用\n,换成puts("").至于为什么我也不太清楚,但是看了我的
提交记录你就明白了

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1000010;

typedef long long ll;

int ch[maxn][26], fa[maxn], dis[maxn], cnt = 1, lst = 1;

int insert(int p, int val) {
    int x = ch[p][val];
    if( !x) {
        int np = ++ cnt; dis[np] = dis[p] + 1; lst = np;
        for ( ; p && !ch[p][val]; p = fa[p]) ch[p][val] = np;
        if( !p) fa[np] = 1;
        else {
            int q = ch[p][val];
            if( dis[q] == dis[p] + 1) fa[np] = q;
            else {
                int nq = ++ cnt; dis[nq] = dis[p] + 1;
                memcpy(ch[nq], ch[q], sizeof(ch[q]));
                fa[nq] = fa[q]; fa[q] = fa[np] = nq;
                for ( ; ch[p][val] == q; p = fa[p]) ch[p][val] = nq;
            }
        }
    }
    else {
        int q = ch[p][val];
        if( dis[q] == dis[p] + 1) lst = q;
        else {
            int nq = ++ cnt; dis[nq] = dis[p] + 1;
            lst = nq;
            memcpy(ch[nq], ch[q], sizeof(ch[q]));
            fa[nq] = fa[q]; fa[q] = nq;
            for ( ; ch[p][val] == q; p = fa[p]) ch[p][val] = nq;
        }
    }
    return lst;
}

int c[maxn], g[maxn];

vector<int> edge[maxn];

char s[maxn];

inline void dfs(int u, int pre, int p) {
    p = insert(p, s[u] - 'a');
    for ( int i = 0; i < edge[u].size(); ++ i) if( edge[u][i] ^ pre) {
        dfs(edge[u][i], u, p);
    }
}

int n, m;

ll sz[maxn];

inline void out(int u, ll kth) {
    if( !( --kth)) return;
    for ( register int i = 0; i <= 25; ++ i) {
        if( kth > sz[ch[u][i]]) kth -= sz[ch[u][i]];
        else {
            putchar('a'+i); out(ch[u][i], kth); return;
        }
    }
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("1.in", "r", stdin);
    freopen("a.out", "w", stdout);
#endif
    scanf("%d%d%s", &n, &m, s+1);
    for ( register int i = 2, a, b; i <= n; ++ i) {
        scanf("%d%d", &a, &b);
        edge[a].push_back(b); edge[b].push_back(a);
    }
    dfs(1, 0, 1);
    for ( register int i = 1; i <= cnt; ++ i) c[dis[i]] ++;
    for ( register int i = 1; i <= cnt; ++ i) c[i] += c[i-1];
    for ( register int i = 1; i <= cnt; ++ i) g[c[dis[i]] --] = i;
    for ( register int i = cnt; i; -- i) {
        sz[g[i]] = 1;
        for ( register int k = 0; k <= 25; ++ k) sz[g[i]] += sz[ch[g[i]][k]];
    }
    printf("%lld", sz[1]);
    puts("");
    for ( register int i = 1; i <= m; ++ i) {
        ll K; scanf("%lld", &K);
        if( K > sz[1]) { puts("-1"); continue;}
        out(1, K); puts("");
    }
    return 0;
}

[BZOJ 2894]世界线的更多相关文章

  1. BZOJ 2894: 世界线 广义后缀自动机

    Code: #include<bits/stdc++.h> #define maxn 300000 #define ll long long using namespace std; ve ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  4. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  5. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  6. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  7. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  8. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  9. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

随机推荐

  1. Ubuntu 17 Nginx 配置 laravel 运行环境

    1 安装 nginx #aptitude install nginx #apatitude install php7.1-fpm 2 在 /etc/nginx/sites-available 建立 s ...

  2. 加载 bean*.xml

    入口 ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:bean*.xml"); /** ...

  3. java并发编程实战:第四章----对象的组合

    一.设计线程安全的类 找出构造对象状态的所有变量(若变量为引用类型,还包括引用对象中的域) 约束状态变量的不变性条件 建立对象状态的并发访问管理策略(规定了如何维护线程安全性) 1.收集同步需求(找出 ...

  4. 23 DesignPatterns学习笔记:C++语言实现 --- 1.3 Singletion

    23 DesignPatterns学习笔记:C++语言实现 --- 1.3 Singletion 2016-07-21 (www.cnblogs.com/icmzn) 模式理解  

  5. 数据恢复软Extundelete

    1>概述  作为一名运维人员,保证数据的安全是根本职责,所以在维护系统的时候,要慎重和细心,但是有时也难免发生出现数据被误删除的情况,这个时候该如何              快速.有效地恢复数 ...

  6. CentOS 新系统后配置

    1. 网络配置 略 1.2 ip_froward 查看 sysctl -a | grep ip_ 修改 vi /etc/sysctl.conf net.ipv4.ip_forward = 1 最大使用 ...

  7. 对SIP摘要认证方案的理解

    一.口令认证常见机制 基于口令认证的系统一般有以下几种口令验证方式: 1.客户端以明文形式将用户名密码通过网络发送到服务器,服务器与已经保存在服务端的用户名密码进行比较,一致则通过验证: HTTP基本 ...

  8. Jenkins 使用 Build Flow 插件配置工作流任务依赖

    Jenkins 使用 Build Flow 插件配置工作流任务依赖 Jenkins 多任务依赖方式的配置方法目前可以通过MultiJob Project 或者Build Flow 或者Piplelin ...

  9. C#读取MP3文件的专辑图片和ID3V2Tag信息(带代码)

    第二次更新,后面的代码有问题,有些专辑图片读取不到.发现是PNG图片的问题.在读取的过程中调试发现,图片帧前10个字节包含了图片的格式,在有些歌曲写着JPEG的格式,数据却是PNG的.先说下思路. j ...

  10. cesium编程入门(六)添加 3D Tiles,并调整位置,贴地

    添加 3D Tiles,并调整位置 3D Tiles 是什么 3DTiles数据集是cesium小组AnalyticlGraphics与2016年3月定义的一种数据集,3DTiles数据集以分块.分级 ...