【传送门: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]字符串树的更多相关文章

  1. BZOJ4477[Jsoi2015]字符串树——可持久化trie树

    题目描述 萌萌买了一颗字符串树的种子,春天种下去以后夏天就能长出一棵很大的字符串树.字符串树很奇特,树枝上都密密麻麻写满了字符串,看上去很复杂的样子.[问题描述]字符串树本质上还是一棵树,即N个节点N ...

  2. BZOJ4477 JSOI2015字符串树(可持久化trie)

    树上建可持久化trie即可,有点过于裸了.darkbzoj过了然而在bzoj一直wa,不知道哪有锅. #include<iostream> #include<cstdio> # ...

  3. [bzoj4477 Jsoi2015]字符串树 (可持久化trie)

    传送门 Solution 复习下tire( ̄▽ ̄)/ 裸的可持久化tire,我用树剖求了下LCA Code #include <cstdio> #include <cstring&g ...

  4. 【BZOJ4477】[JSOI2015]字符串树(Trie树)

    [BZOJ4477][JSOI2015]字符串树(Trie树) 题面 BZOJ 题解 对于每个点维护其到根节点的所有字符串构成的\(Trie\),显然可持久化一下就很好写了. 然后每次询问就是\(u+ ...

  5. [Jsoi2015]字符串树

    https://www.zybuluo.com/ysner/note/1298148 题面 字符串树本质上还是一棵树,即\(N\)个节点\(N-1\)条边的连通无向无环图,节点 从\(1\)到\(N\ ...

  6. luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树

    LINK:字符串树 先说比较简单的正解.由于我没有从最简单的考虑答案的角度思考 所以... 下次还需要把所有角度都考察到. 求x~y的答案 考虑 求x~根+y~根-2*lca~根的答案. 那么问题变成 ...

  7. 【BZOJ4477】字符串树(可持久化Trie)

    此题花费我整整三天的功夫.还在NoiP贴吧发过贴. 最后发现trie树建新节点时信息未完全复制,真是愚蠢之极. 言归正传. 如果我们已经知道了每个点上的trie树那么询问就是sum[x]+sum[y] ...

  8. BZOJ 4477: [Jsoi2015]字符串树 可持久化trie树

    这个是真——可持久化字典树..... code: #include <bits/stdc++.h> #define N 100006 #define setIO(s) freopen(s& ...

  9. 「JSOI2015」字符串树

    「JSOI2015」字符串树 传送门 显然可以树上差分. 我们对于树上每一条从根出发的路径都开一 棵 \(\text{Trie}\) 树,那么我们就只需要在 \(\text{Trie}\) 树中插入一 ...

随机推荐

  1. centos7修改网卡名

    http://blog.csdn.net/henulwj/article/details/47061023

  2. OpenLDAP 2.4.44 安装 + phpLDAPadmin 安装

    网上太多的例子搞 OpenLDAP  + phpLDAPadmin  但是没有一个能让你成功配置起来.蛋疼得很.记录一下过程 系统版本:centos7.4 软件版本:2.4.44  超级重要,版本不对 ...

  3. Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析

    相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...

  4. 配置 Phpstorm + Xdebug + xampp

    配置 Phpstorm + Xdebug + xampp 1 Xampp 安装好xampp,配置 httpd.conf 在xampp面板中 单击后会出现一些配置文件,httpd.conf位于第一个 将 ...

  5. 安卓通过OkHttp获取json数据

    使用Http协议访问网络 OkHttp使用 可以很好的获取接口数据!json数据! 支持get和post提交方式!!! 1.引入模块 compile 'com.squareup.okhttp3:okh ...

  6. xmanager使用

    Xmanager全称Netsarang Xmanager,是国外一套非常优秀的远程监控软件.在UNIX/Linux和Windows网络环境中,Xmanager是最好的连通解决方案.我推 荐大家下载En ...

  7. POJ 3368 线段树

    思路: 先统计在第i个位置当前数字已经出现的次数. 维护两个数组,一个是当前位置的数字最后一次出现的位置,另一个是当前位置的数字第一次出现的位置 查找的时候分为两种情况: 没有和边界相交(意会意会)的 ...

  8. Codeforces 703D Mishka and Interesting sum 离线+树状数组

    链接 Codeforces 703D Mishka and Interesting sum 题意 求区间内数字出现次数为偶数的数的异或和 思路 区间内直接异或的话得到的是出现次数为奇数的异或和,要得到 ...

  9. 将枚举存入map集合

    遍历枚举存入集合: Map<String,Object> deptLevel = new HashMap<>(); for(OrgBussinessEnum orgBussin ...

  10. 电信流氓注入JS

    (function () { var cs_url = _pushshowjs_.url, cs_delay = window.cs_delay; var cs_styles = window.sty ...