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}\) 树中插入一 ...
随机推荐
- 洛谷 P1301 魔鬼之城
P1301 魔鬼之城 题目描述 在一个被分割为N*M个正方形房间的矩形魔鬼之城中,一个探险者必须遵循下列规则才能跳跃行动.他必须从(1, 1)进入,从(N, M)走出:在每一房间的墙壁上都写了一个魔法 ...
- POJ 3270
黑书上的经典题了.我说说解这个题的巧妙的地方吧. 首先,竟然和置换联系起来了.因为其实一个交换即至少可以使其中一个元素到达指定位置了.和循环置换联合起来,使得一个循环内的数可以一步到达指定位置,很巧妙 ...
- codevs 3372 选学霸(hash+并查集+多重背包)
先通过并查集处理出来有多少种不同的集合,每一个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候能够通过hash处理出来每一个数目同样的集合的个数. 这样以人数为权值.个数为限制进行 ...
- bzoj3436: 小K的农场(差分约束)
3436: 小K的农场 题目:传送门 题解: 查分基础: t==1 a>=b+c t==2 b>=a-c t==3 a>=b+0 b>=a+0 跑最长路一A 代码: #i ...
- POJ 1949 DP?
题意: 有n个家务,第i个家务需要一定时间来完成,并且第i个任务必须在它 "前面的" 某些任务完成之后才能开始. 给你任务信息,问你最短需要多少时间来完成任务. 输入: 第一行n个 ...
- Codeforces 701E Connecting Universities 贪心
链接 Codeforces 701E Connecting Universities 题意 n个点的树,给你2*K个点,分成K对,使得两两之间的距离和最大 思路 贪心,思路挺巧妙的.首先dfs一遍记录 ...
- transient修饰符的作用
transient修饰符的作用: entity实体类: package com.baidu.entity; import com.fasterxml.jackson.annotation.JsonIg ...
- VS2012数据绑定控件DataGridView和DataGrid
在做Windows窗体上ADO.NET数据绑定试验的时候,发现实例中提到的一些控件在vs2012的工具箱中找不到,开始以为是工具箱中的控件太多没看到,结果重新找还是没找到,难道是因为控件升级了?yes ...
- POJ 1990 MooFest【 树状数组 】
题意:给出n头牛,每头牛有一个听力v,坐标x,两头牛之间的能量为max(v1,v2)*dist(v1,v2),求总的能量值 先将每头牛按照v排序,排完顺序之后,会发现有坐标比当前的x小的,会有坐标比当 ...
- nginx的location 匹配的规则问题
正则解释: ~ #匹配一个正则匹配,区分大小写~* #匹配一个正则,不区分大小写^~ #普通字符匹配,如果该选择匹配不匹配别的选项,一般用来匹配目录= #精确匹配 匹配案例:location = / ...