[BZOJ 2894]世界线
\(\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]世界线的更多相关文章
- BZOJ 2894: 世界线 广义后缀自动机
Code: #include<bits/stdc++.h> #define maxn 300000 #define ll long long using namespace std; ve ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- Web01 基础
网址组成(四部分) 协议 http,https (https是加密的http) 主机 g.cn zhihu.com之类的网址 端口 HTTP协议默认80,因此一般不用填写 路径 下面的 / 和 / ...
- 看图说话:关于BI那点事儿
[编者按]BI=DW+数据挖掘+业务分析+社会学?BI三部曲:管数据.看数据.源数据.BI有三种放法:技术部.业务部和独立部门.BI的工作=20%数据平台+30%数据支持+50%数据应用.
- java中double和float精度丢失问题
为什么会出现这个问题呢,就这是java和其它计算机语言都会出现的问题,下面我们分析一下为什么会出现这个问题:float和double类型主要是为了科学计算和工程计算而设计的.他们执行二进制浮点运算,这 ...
- UVa 10537 The Toll! Revisited (最短路)
题意:给定一个图,你要从 s 到达 t,当经过大写字母时,要交 ceil(x /20)的税,如果经过小写字母,那么交 1的税,问你到达 t 后还剩下 c 的,那么最少要带多少,并输出一个解,如果多个解 ...
- mysql 截取字符串
#select SUBSTRING_INDEX('1,2', ',', 1); SELECT * FROM dis_disease WHERE id = ( SELECT SUBSTRING_INDE ...
- nohup、&、setsid、fork和fg、bg究竟有啥区别?
目录 目录 1 1. 名词解释 1 2. 什么是守护进程? 2 2.1. 后台运行 2 2.2. 解释关系 2 3. 以"&"方式运行有何问题? 2 4. fork 2 5 ...
- Python之模块和包学习
模块简介 python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象 ...
- ZOJ3703 Happy Programming Contest 2017-04-06 23:33 61人阅读 评论(0) 收藏
Happy Programming Contest Time Limit: 2 Seconds Memory Limit: 65536 KB In Zhejiang University P ...
- 企业搜索引擎开发之连接器connector(二十四)
本人在上文中提到,连接器实现了两种事件依赖的机制 ,其一是我们手动操作连接器实例时:其二是由连接器的自动更新机制 上文中分析了连接器的自动更新机制,即定时器执行定时任务 那么,如果我们手动操作连接器实 ...
- OpenResty 最佳实践 (1)
此文已由作者汤晓静授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. OpenResty 发展起源 OpenResty(也称为 ngx_openresty)是一个全功能的 Web ...
