CC TSUBSTR:Substrings on a Tree——题解
https://www.codechef.com/problems/TSUBSTR
https://vjudge.net/problem/CodeChef-TSUBSTR
给一棵点权为字母的树,你只能从任意节点往下走得到一个字符串,求出可得到的不重复字符串数量和其中字典序第k小的字符串(在重新定义字母的字典序前提下)?
垃圾谷歌翻译坑我不浅。
广义后缀自动机处理之后就是BZOJ3998:[TJOI2015]弦论t=0的解法了。
注意空字符串也算。
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
const int N=2e6+;
struct tree{
int a[],fa,l;
}tr[N];
struct node{
int to,nxt;
}e[N];
char s[N];
int tot,cnt,head[N],pos[N];
ll a[N],w[N],size[N],sum[N];
bool vis[N];
queue<int>q;
inline void add(int u,int v){
e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
inline int insert(int p,int c){
int np=tr[p].a[c];
if(np&&tr[np].l==tr[p].l+)return np;
np=++tot;tr[np].l=tr[p].l+;
for(;p&&!tr[p].a[c];p=tr[p].fa)tr[p].a[c]=np;
if(!p)tr[np].fa=;
else{
int q=tr[p].a[c];
if(tr[p].l+==tr[q].l)tr[np].fa=q;
else{
int nq=++tot;tr[nq].l=tr[p].l+;
memcpy(tr[nq].a,tr[q].a,sizeof(tr[q].a));
tr[nq].fa=tr[q].fa;tr[q].fa=tr[np].fa=nq;
for(;p&&tr[p].a[c]==q;p=tr[p].fa)tr[p].a[c]=nq;
}
}
return np;
}
void bfs(int st){
tot=;
q.push(st);vis[st]=;
pos[st]=insert(,s[st]-'a');
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(vis[v])continue;
q.push(v);vis[v]=;
pos[v]=insert(pos[u],s[v]-'a');
}
}
}
int main(){
int len,q;
scanf("%d%d",&len,&q);
scanf("%s",s+);
for(int i=;i<len;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
bfs();
for(int i=;i<=tot;i++)w[tr[i].l]++;
for(int i=;i<=len;i++)w[i]+=w[i-];
for(int i=;i<=tot;i++)a[w[tr[i].l]--]=i;
for(int i=tot;i>=;i--){
size[a[i]]=;
}
for(int i=tot;i>=;i--){
sum[a[i]]=size[a[i]];
for(int j=;j<;j++)
if(tr[a[i]].a[j])sum[a[i]]+=sum[tr[a[i]].a[j]];
}
printf("%lld\n",sum[]);
for(int i=;i<=q;i++){
ll k;
scanf("%s%lld",s,&k);
if(k>sum[]){puts("-1");continue;}
int now=;
while(k>size[now]){
k-=size[now];
for(int j=;j<;j++){
if(k>sum[tr[now].a[s[j]-'a']]){
k-=sum[tr[now].a[s[j]-'a']];
}else{
now=tr[now].a[s[j]-'a'];
putchar(s[j]);
break;
}
}
}
puts("");
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
CC TSUBSTR:Substrings on a Tree——题解的更多相关文章
- Codeforces Round #530 (Div. 2):D. Sum in the tree (题解)
D. Sum in the tree 题目链接:https://codeforces.com/contest/1099/problem/D 题意: 给出一棵树,以及每个点的si,这里的si代表从i号结 ...
- POJ 1308 Is It A Tree?--题解报告
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 31092 Accepted: 10549 D ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
- 【文文殿下】CF1098C Construct a tree 题解
题解 挺水的一道题. Rating $ \color{orange} {2300}$ 以下送命题. 首先我们知道,所有子树大小之和就是节点个数加上从根到所有节点的路径长度之和. 他要求度数尽可能小,所 ...
- BZOJ2588:Count on a tree——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2588 Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你 ...
- 【日常学习】【二叉树遍历】Uva548 - Tree题解
这道题目本身不难,给出后序遍历和中序遍历,求到节点最小路径的叶子,同样长度就输出权值小的叶子. Uva上不去了,没法測.基本上是依照ruka的代码来的.直接上代码 //Uva548 Tree #inc ...
- SPOJ - QTREE Query on a tree题解
题目大意: 一棵树,有边权,有两个操作:1.修改一条边的权值:2.询问两点间路径上的边的权值的最大值. 思路: 十分裸的树链剖分+线段树,无非是边权要放到深度大的一端的点上,但是有两个坑爹的地方,改了 ...
- 洛谷 P2633 Count on a tree 题解
题面 对于每个点建立一颗主席树: 然后按照树上差分的思想统计主席树的前缀和: lca+主席树+前向星存表就可以了: #include <bits/stdc++.h> #define inc ...
- [Luogu P4178]Tree 题解(点分治+平衡树)
题目大意 给定一棵树,边带权,问有多少点对满足二者间距离$\leq K$,$n \leq 40000$. 题解 点分治专题首杀!$Jackpot!$ (本来看着题意比较简单想捡个软柿子捏,结果手断了… ...
随机推荐
- nodejs HTTP服务
nodejs中的HTTP服务 nodejs最重要的方面之一是具有非常迅速的实现HTTP和HTTPS服务器和服务的能力.http服务是相当低层次的,你可能要用到不同的模块,如express来实现完整 ...
- PS 抠图和添加背景图
1.打开需要抠的图--然后使用套索类工具,魔棒类工具,钢笔类工具均可选择需要扣的图片范围任何在Delete(如果抠反了可以进行反选Ctrl +shift+I) 2.然后把任一一张背景图直接拖到PS里面 ...
- hdu1203I NEED A OFFER!(01背包)
I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- Spring Cloud(六):Hystrix 监控数据聚合 Turbine【Finchley 版】
Spring Cloud(六):Hystrix 监控数据聚合 Turbine[Finchley 版] 发表于 2018-04-17 | 更新于 2018-05-07 | 上一篇我们介绍了使用 H ...
- 209. First Unique Character in a String
Description Find the first unique character in a given string. You can assume that there is at least ...
- Laxcus大数据管理系统2.0(12)- 第十章 运行
第十章 运行 本章将介绍一些Laxcus集群基本运行.使用情况,结合图片和表格表示.地点是我们的大数据实验室,使用我们的实验集群.数据来自于我们的合作伙伴,软件平台混合了Windows和Fedora ...
- 78[LeetCode] Subsets
Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solut ...
- cenos环境变量配置
Beego环境搭建和bee工具安装使用,以Windows环境为例. 首先,下载并安装好GO并配置好GOROOT和GOPATH环境变量(如果您是用msi包安装的go,那么这些环境变量已经设置好了).并在 ...
- Kali渗透测试-SNMP
1.snmpwalk -v指定snmpwalk版本 -c指定密码 2.snmp-check 获取系统信息,主机名,操作系统及架构 获取用户账户信息 获取网络信息 获取网络接口信息 IP信息 路由信息 ...
- [C++] Copy Control (part 1)
Copy, Assign, and Destroy When we define a class, we specify what happens when objects of the class ...