BZOJ4477: [Jsoi2015]字符串树
【传送门:BZOJ4477】
简要题意:
给出一棵n个点的树,树上的边都代表一个字符串,给出Q个询问,每个询问输入x,y和字符串s,求出x到y的路径上以s为前缀的字符串个数
题解:
自己yy了一波可持久化字典树
将每条边的字符串放到深度更深的节点保存
对于x到y的路径,将rt[x]+rt[y]-2*rt[lca]就可以了,因为我们不需要lca到它父亲的字符串
本机RE,提交AC。。。怕是机子出毛病了
参考代码:
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
struct trie
{
int son[],c;
trie()
{
c=;
memset(son,,sizeof(son));
}
}tr[];int trlen;
int rt[];
struct node
{
int x,y,next;
}a[];int len,last[];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
}
char st[];
int slen;
void Link(int &u1,int d)
{
if(u1==) u1=++trlen;
tr[u1].c=;
if(d==slen) return ;
d++;
int y=st[d]-'a'+;
Link(tr[u1].son[y],d);
}
void Merge(int &u1,int u2)
{
if(u1==){u1=u2;return ;}
if(u2==) return ;
tr[u1].c+=tr[u2].c;
for(int i=;i<=;i++) Merge(tr[u1].son[i],tr[u2].son[i]);
}
int f[][],bin[],dep[];
void dfs(int x)
{
for(int i=;bin[i]<=dep[x];i++) f[x][i]=f[f[x][i-]][i-];
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=f[x][])
{
f[y][]=x;
dep[y]=dep[x]+;
Merge(rt[y],rt[x]);
dfs(y);
}
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=;i>=;i--)
{
if(dep[x]-dep[y]>=bin[i])
{
x=f[x][i];
}
}
if(x==y) return x;
for(int i=;i>=;i--)
{
if(dep[x]>=bin[i]&&f[x][i]!=f[y][i])
{
x=f[x][i];y=f[y][i];
}
}
return f[x][];
}
char s[];int clen;
int findc(int u1,int u2,int u3,int d)
{
int c=tr[u1].c+tr[u2].c-*tr[u3].c;
if(c==) return ;
if(d==clen) return c;
d++;
int y=s[d]-'a'+;
return findc(tr[u1].son[y],tr[u2].son[y],tr[u3].son[y],d);
}
int main()
{
bin[]=;for(int i=;i<=;i++) bin[i]=bin[i-]<<;
int n;
scanf("%d",&n);
len=;memset(last,,sizeof(last));
trlen=;memset(rt,,sizeof(rt));
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d%s",&x,&y,st+);slen=strlen(st+);
ins(x,y);
Link(rt[y],);
}
f[][]=;dep[]=;dfs();
int Q;
scanf("%d",&Q);
for(int i=;i<=Q;i++)
{
int x,y;
scanf("%d%d%s",&x,&y,s+);
clen=strlen(s+);
int lca=LCA(x,y);
printf("%d\n",findc(rt[x],rt[y],rt[lca],));
}
return ;
}
BZOJ4477: [Jsoi2015]字符串树的更多相关文章
- BZOJ4477[Jsoi2015]字符串树——可持久化trie树
题目描述 萌萌买了一颗字符串树的种子,春天种下去以后夏天就能长出一棵很大的字符串树.字符串树很奇特,树枝上都密密麻麻写满了字符串,看上去很复杂的样子.[问题描述]字符串树本质上还是一棵树,即N个节点N ...
- BZOJ4477 JSOI2015字符串树(可持久化trie)
树上建可持久化trie即可,有点过于裸了.darkbzoj过了然而在bzoj一直wa,不知道哪有锅. #include<iostream> #include<cstdio> # ...
- [bzoj4477 Jsoi2015]字符串树 (可持久化trie)
传送门 Solution 复习下tire( ̄▽ ̄)/ 裸的可持久化tire,我用树剖求了下LCA Code #include <cstdio> #include <cstring&g ...
- 【BZOJ4477】[JSOI2015]字符串树(Trie树)
[BZOJ4477][JSOI2015]字符串树(Trie树) 题面 BZOJ 题解 对于每个点维护其到根节点的所有字符串构成的\(Trie\),显然可持久化一下就很好写了. 然后每次询问就是\(u+ ...
- [Jsoi2015]字符串树
https://www.zybuluo.com/ysner/note/1298148 题面 字符串树本质上还是一棵树,即\(N\)个节点\(N-1\)条边的连通无向无环图,节点 从\(1\)到\(N\ ...
- luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树
LINK:字符串树 先说比较简单的正解.由于我没有从最简单的考虑答案的角度思考 所以... 下次还需要把所有角度都考察到. 求x~y的答案 考虑 求x~根+y~根-2*lca~根的答案. 那么问题变成 ...
- 【BZOJ4477】字符串树(可持久化Trie)
此题花费我整整三天的功夫.还在NoiP贴吧发过贴. 最后发现trie树建新节点时信息未完全复制,真是愚蠢之极. 言归正传. 如果我们已经知道了每个点上的trie树那么询问就是sum[x]+sum[y] ...
- BZOJ 4477: [Jsoi2015]字符串树 可持久化trie树
这个是真——可持久化字典树..... code: #include <bits/stdc++.h> #define N 100006 #define setIO(s) freopen(s& ...
- 「JSOI2015」字符串树
「JSOI2015」字符串树 传送门 显然可以树上差分. 我们对于树上每一条从根出发的路径都开一 棵 \(\text{Trie}\) 树,那么我们就只需要在 \(\text{Trie}\) 树中插入一 ...
随机推荐
- java源码之Comparable和Comparator
1,Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着“该类支持排序”. 即然实现Comparable接口的类支持排序,假设现在存在“实 ...
- 零基础学HTML 5实战开发(第一季)
開始学习html5了.趋势不得不学习啊,之前老毛说过落后就要挨打,如今是不学习就要被市场淘汰,被社会淘汰.喜欢挑战,喜欢冒险.来吧.csdn给我们提供了那么好的平台.用起来..零基础学HTML 5的实 ...
- Maven传递依赖的时候,同名包不同版本号的包均会下载,可是编译的时候,仅仅会载入一个高版本号的。
描写叙述,在一个Maven项目中.同一时候依赖了spring-tomcat-weaver 和 struts-core 包.可是spring-tomcat-weaver 须要commons-dige ...
- oracle 时间戳TIMESTAMP
//数据库 UPDATETIMESTAMP TIMESTAMP(6) //dto /** 更新时间戳 **/ private String updatetimestamp; //dao //插入操作 ...
- Android学习路线(十三)Activity生命周期——暂停和恢复(Pausing and Resuming )一个Activity
在正常使用应用的过程中.前台的activity在一些时候会被其它的组件遮挡,导致这个activity暂停.举个样例.当一个半透明的activity被打开(比如一个dialog样式的activity), ...
- LeetCode -- 求字符串数组中的最长公共前缀
题目描写叙述: Write a function to find the longest common prefix string amongst an array of strings.就是给定1个 ...
- [NOIP2017] 逛公园 解题报告(DP)
我很不想说 在我的AC代码上我打了表,但实在没有办法了.莫名的8,9个点RE.然而即便是打表...也花了我很久. 这大概是NOIP2017最难的题了,为了让不懂的人更容易理解,这篇题解会比较详细 我的 ...
- mybatis的sql中字段两种映射(映射到实体)方式
mybatis的xml配置文件中,字段映射的两种方式: 1.resultMap标签中将数据库的字段与实体类中的字段对应: <resultMap id="BaseResultMap&qu ...
- .Net垃圾回收和大对象处理
本文引自:http://www.cnblogs.com/yukaizhao/archive/2011/11/21/dot_net_gc_large_object_heap.html CLR垃圾回收器根 ...
- MyBatis数据持久化(一)准备工作
MyBatis简介 mybatis的前生是ibatis,它是一款非常优秀的java持久层框架,所有sql语句写在配置文件中,和另外一款比较知名的orm框架hibernate比起来显得更加小巧灵活,也是 ...