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】字符串树相关推荐

  1. P6088-[JSOI2015]字符串树【可持久化Trie,LCA】

    正题 题面链接:https://www.luogu.com.cn/problem/P6088 题目大意 nnn个点的一棵树,每条边上有一个字符串,求一条路径上有多少以询问字符串为前缀的字符串. 解题思 ...

  2. 【BZOJ4598】[Sdoi2016]模式字符串 树分治+hash

    [BZOJ4598][Sdoi2016]模式字符串 Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每 ...

  3. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  4. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  5. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  6. 字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全

    文章目录 1. 算法背景 2. Trie 树实现原理 2.1 Trie 树的构建 2.2 Trie树的查找 2.3 Trie树的遍历 2.4 Trie树的时间/空间复杂度 2.5 Trie 树 Vs ...

  7. 奇小葩讲设备树(1/5)-- Linux设备树详解(一) 基础知识

    关于设备树,之前就经过详细的系统培训,但是本着会用就行的原则,对各个知识点都没有进行系统的总结.都是用到哪里学哪里,时间长了,基本也忘记了.所以对于后期知识各个知识点进行总结,本章主要讨论一下内容,能 ...

  8. C++ 各类树的算法

    树的内容比较多,我一步步积累到这篇文章中 数据结构 最基本的二叉树,结构体中分别有基本的左孩子节点,有孩子节点,val数据值等基本内容 二叉搜索树:左孩子要比父节点小,右孩子要比父节点大.由于树构建完 ...

  9. Android 开发工程师面试指南

    原文链接:https://github.com/GeniusVJR/LearningNotes <Android 开发工程师面试指南 LearningNotes >,作者是知乎Androi ...

最新文章

  1. R语言计算每个分组的行数并将结果添加到dataframe中实战
  2. 远程链接oracle 12514,数据库建好后,本地连接正常,远程连接ORA-12514错误
  3. Spring Cloud【Finchley】-12使用Hystrix Dashboard实现Hystrix数据的可视化监控
  4. Auty 2017——WebMonitor接口本地检测平台
  5. 给书配代码-电力经济调度(2):计及动态约束及节能环保要求的经济调度
  6. Ubuntu Server如何配置SFTP
  7. C语言试题五十九之请编写一个函数fun,它的功能时:求fibonacci数列中大于t的最小的一个数,结果由函数返回。
  8. 图深度学习-第2部分
  9. 分布式 dynamips+dyangen (更新于07.3.30)
  10. C#调试WebService
  11. Java多线程11:ReentrantLock的使用和Condition
  12. Linux nohup命令详解
  13. 时尚行业的二维码应用!2021 全新流行趋势
  14. c语言在内存存储结构,C语言中float,double类型,在内存中的结构(存储方式)
  15. 无人机在环保行业中的应用
  16. 小程序管理新闻资讯分类-微信小程序视频教程27
  17. 如何从视频中分离音频/提取音频/提取视频
  18. C++上机实验二第2题
  19. 安卓中图片占用内存大小分析
  20. 关于测试工程师进入职场如何规划自己的职业测试生涯。

热门文章

  1. Qt中Ui名字空间以及setupUi函数的原理和实现
  2. 二十二、“此生无悔入华夏,来世还在种花家”(2021.7.1)
  3. 3DSlicer9:FAQ-3
  4. VTK修炼之道56:图形基本操作进阶_表面重建技术(三维点云曲面重建)
  5. 50种优化数据库的方法
  6. 词法分析(1)---词法分析的有关概念以及转换图
  7. 有关数据库的多库查询
  8. JS判断页面控件是否可用
  9. vim中使用split
  10. STM32-中断优先级