JZOJ 4061. 【JSOI2015】字符串树
Description
Input
Output
Sample Input
4
1 2 ab
2 4 ac
1 3 bc
3
1 4 a
3 4 b
3 2 ab
Sample Output
2
1
1
Data Constraint
Soluiton
这题是典型的可持久化 Trie 树!
由于每一个读入的串长度不超过 10,所以 Trie 的深度也不会超过 10 。
例如有一条边是 (u,v,s)(u,v,s),
那么我们将 v 从 u 上继承信息,然后对于 v 的 Trie 树,插入 s 这个串,将路径上每一个点的权值都+1;
然后对于每一个询问 (x,y,s)(x,y,s),用s在 x , y , lca(x,y)lca(x,y) 中走他们各自的 Trie 树,走到点 p,
那么 p 的权值就是这棵 Trie 树有多少个串前缀有 s,
然后用 x 与 y 的值和 减去 两倍的 lca(x,y)lca(x,y) 的值。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=100001;
struct trie
{int son[26],v;
}tr[N*10];
int n,q,u,v,ans,tot;
int first[N],next[N*2],en[N*2],len[N*2];
int dep[N],fa[N],f[N][20];
int que[N],g[N];
char w[N*2][12],s[12];
void insert(int x,int y)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;len[tot]=strlen(s+1);for(int i=1;i<=len[tot];i++) w[tot][i]=s[i];
}
void add(int p,int now,int num)
{for(int i=1;i<=len[num];i++){tr[now]=tr[p];tr[now].v++;p=tr[p].son[w[num][i]-'a'];tr[now].son[w[num][i]-'a']=++tot;now=tot;}tr[now].v++;
}
void bfs()
{int l=0,r=que[1]=1;while(l<r){int x=que[++l];dep[x]=dep[f[x][0]=fa[x]]+1;for(int i=1;f[f[x][i-1]][i-1];i++) f[x][i]=f[f[x][i-1]][i-1];for(int i=first[x];i;i=next[i])if(en[i]!=fa[x]){fa[que[++r]=en[i]]=x;g[en[i]]=++tot;add(g[x],tot,i);}}
}
int lca(int x,int y)
{if(dep[x]<dep[y]) swap(x,y);for(int i=log2(dep[x]);i>=0;i--)if(dep[f[x][i]]>=dep[y]) x=f[x][i];for(int i=log2(dep[x]);i>=0;i--)if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];return (x==y)?x:f[x][0];
}
int find(int now,char *s)
{int l=strlen(s+1);for(int i=1;i<=l;i++) now=tr[now].son[s[i]-'a'];return tr[now].v;
}
int main()
{scanf("%d",&n);for(int i=1;i<n;i++){scanf("%d%d %s",&u,&v,s+1);insert(u,v);insert(v,u);}tot=0;bfs();scanf("%d",&q);while(q--){scanf("%d%d %s",&u,&v,s+1);ans=find(g[u],s)+find(g[v],s);ans-=find(g[lca(u,v)],s)*2;printf("%d\n",ans);}return 0;
}
JZOJ 4061. 【JSOI2015】字符串树相关推荐
- P6088-[JSOI2015]字符串树【可持久化Trie,LCA】
正题 题面链接:https://www.luogu.com.cn/problem/P6088 题目大意 nnn个点的一棵树,每条边上有一个字符串,求一条路径上有多少以询问字符串为前缀的字符串. 解题思 ...
- 【BZOJ4598】[Sdoi2016]模式字符串 树分治+hash
[BZOJ4598][Sdoi2016]模式字符串 Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每 ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- 退役前的做题记录1.0
退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...
- 字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全
文章目录 1. 算法背景 2. Trie 树实现原理 2.1 Trie 树的构建 2.2 Trie树的查找 2.3 Trie树的遍历 2.4 Trie树的时间/空间复杂度 2.5 Trie 树 Vs ...
- 奇小葩讲设备树(1/5)-- Linux设备树详解(一) 基础知识
关于设备树,之前就经过详细的系统培训,但是本着会用就行的原则,对各个知识点都没有进行系统的总结.都是用到哪里学哪里,时间长了,基本也忘记了.所以对于后期知识各个知识点进行总结,本章主要讨论一下内容,能 ...
- C++ 各类树的算法
树的内容比较多,我一步步积累到这篇文章中 数据结构 最基本的二叉树,结构体中分别有基本的左孩子节点,有孩子节点,val数据值等基本内容 二叉搜索树:左孩子要比父节点小,右孩子要比父节点大.由于树构建完 ...
- Android 开发工程师面试指南
原文链接:https://github.com/GeniusVJR/LearningNotes <Android 开发工程师面试指南 LearningNotes >,作者是知乎Androi ...
最新文章
- R语言计算每个分组的行数并将结果添加到dataframe中实战
- 远程链接oracle 12514,数据库建好后,本地连接正常,远程连接ORA-12514错误
- Spring Cloud【Finchley】-12使用Hystrix Dashboard实现Hystrix数据的可视化监控
- Auty 2017——WebMonitor接口本地检测平台
- 给书配代码-电力经济调度(2):计及动态约束及节能环保要求的经济调度
- Ubuntu Server如何配置SFTP
- C语言试题五十九之请编写一个函数fun,它的功能时:求fibonacci数列中大于t的最小的一个数,结果由函数返回。
- 图深度学习-第2部分
- 分布式 dynamips+dyangen (更新于07.3.30)
- C#调试WebService
- Java多线程11:ReentrantLock的使用和Condition
- Linux nohup命令详解
- 时尚行业的二维码应用!2021 全新流行趋势
- c语言在内存存储结构,C语言中float,double类型,在内存中的结构(存储方式)
- 无人机在环保行业中的应用
- 小程序管理新闻资讯分类-微信小程序视频教程27
- 如何从视频中分离音频/提取音频/提取视频
- C++上机实验二第2题
- 安卓中图片占用内存大小分析
- 关于测试工程师进入职场如何规划自己的职业测试生涯。