挺好想的

trie建树后,按dfn序建可持久化

注意:计数变量多的题目一定要注意检查会不会用的时候搞混了

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
using namespace std;
typedef long long LL;
const int M=300007;
const int N=2000007;
inline int rd(){
    int x=0;bool f=1;char c=getchar();
    for(;!isdigit(c);c=getchar())if(c=='-')f=0;
    for(;isdigit(c);c=getchar())x=x*10+c-48;
    return f?x:-x;
}

int n,tot;
char s[M];
int ch[M][26];
int g[M],td;
struct edge{int y,next;}e[M];
int st[M],ed[M],pid[M],dfn;
int root[M],cnt;
int pt[M];
struct node{
    int c[2],sz;
    node(){c[0]=c[1]=sz=0;}
}a[N];

void ins(int ii){
    scanf("%s",s+1);
    int x=0,i,k,len=strlen(s+1);
    for(i=len;i>0;i--){
        k=s[i]-'a';
        if(ch[x][k])x=ch[x][k];
        else x=ch[x][k]=++tot;
    }
    e[++td].y=ii;e[td].next=g[x];g[x]=td;
    pt[ii]=x;
}

void dfs(int x){
    if(g[x]) st[x]=++dfn,pid[dfn]=x;
    for(int i=0;i<26;i++) if(ch[x][i]) dfs(ch[x][i]);
    if(g[x]) ed[x]=dfn;
}

int cpynode(int x){
    a[++cnt]=a[x];
    a[cnt].sz++;
    return cnt;
}

int ins(int rt,int l,int r,int to){
    int x=cpynode(rt);
    if(l==r) return x;
    int mid=l+r>>1;
    if(to<=mid)a[x].c[0]=ins(a[rt].c[0],l,mid,to);
    else a[x].c[1]=ins(a[rt].c[1],mid+1,r,to);
    return x;
}

int get(int lt,int rt,int l,int r,int to){
    if(l==r) return l;
    int mid=l+r>>1;
    int num=a[a[rt].c[0]].sz-a[a[lt].c[0]].sz;
    if(to<=num) return get(a[lt].c[0],a[rt].c[0],l,mid,to);
    else return get(a[lt].c[1],a[rt].c[1],mid+1,r,to-num);
}

int main(){
    int i,p,x,y;
    n=rd();
    for(i=1;i<=n;i++) ins(i);
    dfs(0);
    for(i=1;i<=dfn;i++){
        root[i]=root[i-1];
        x=pid[i];
        for(p=g[x];p;p=e[p].next)
            root[i]=ins(root[i],1,n,e[p].y);
    }
    for(i=1;i<=n;i++){
        p=rd();
        x=pt[i];
        y=a[root[ed[x]]].sz-a[root[st[x]-1]].sz;
        if(p>y||p<=0) puts("-1");
        else printf("%d\n",get(root[st[x]-1],root[ed[x]],1,n,p));
    }
    return 0;
}

bzoj3439 trie+可持久化线段树的更多相关文章

  1. BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树

    题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...

  2. BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...

  3. 【Luogu P3834】可持久化数组(可持久化线段树)

    题目链接 可持久化线段树模板题. 这里总结一下可持久化线段树. 可持久化数据结构就是能恢复历史状态的数据结构,比如可持久化\(Trie\),并查集,平衡树. 可持久化数组是最基础的,这里通过可持久化线 ...

  4. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  5. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  6. 【BZOJ-2653】middle 可持久化线段树 + 二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1298  Solved: 734[Submit][Status][Discu ...

  7. HDU 4866 Shooting(持久化线段树)

    view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...

  8. 【BZOJ-3653】谈笑风生 DFS序 + 可持久化线段树

    3653: 谈笑风生 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 628  Solved: 245[Submit][Status][Discuss] ...

  9. 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树

    没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...

随机推荐

  1. C# 利用反射根据类名创建类的实例对象

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...

  2. css样式加载顺序及覆盖顺序深入理解

    注:内容转载 很多的新手朋友们对css样式加载顺序和覆盖顺序的理解有所偏差,下面用示例为大家详细的介绍下,感兴趣的朋友不要错过 { height: 100%; width: 200; position ...

  3. 1130mysql explain中的type列含义和extra列的含义

    很多朋友在用mysql进行调优的时候都肯定会用到explain来看select语句的执行情况,这里简单介绍结果中两个列的含义. 1 type列 官方的说法,说这列表示的是"访问类型" ...

  4. Android Studio NDK编程-环境搭建及Hello!

    一,下载 安装android-ndk开发包 NDK各个版本链接二,新建项目NDKDemo,选择空Activity就可以:(注:Android studio 2.2,可通过SDK Tools 添加LLD ...

  5. 基于Emgu CV的人脸检测代码

    这个提供的代码例子是Emgu CV提供的源码里面自带的例子,很好用,基本不需要改,代码做的是人脸检测不是人脸识别,这个要分清楚.再就是新版本的Emgu CV可能会遇到系统32位和64位处理方式有区别的 ...

  6. Cocos2d-x 3.X 事件分发机制

    介绍 Cocos2d-X 3.X 引入了一种新的响应用户事件的机制. 涉及三个基本的方面: Event listeners 封装你的事件处理代码 Event dispatcher 向 listener ...

  7. ORB-SLAM(三)地图初始化

    单目SLAM地图初始化的目标是构建初始的三维点云.由于不能仅仅从单帧得到深度信息,因此需要从图像序列中选取两帧以上的图像,估计摄像机姿态并重建出初始的三维点云. ORB-SLAM中提到,地图初始化常见 ...

  8. Xcode真机测试could not find developer disk image解决方法

    原文地址:http://my.oschina.net/u/2340880/blog/521700 Xcode真机测试could not find developer disk image解决方法 在使 ...

  9. 【poj1694】 An Old Stone Game

    http://poj.org/problem?id=1694 (题目链接) 题意 一棵树,现在往上面放石子.对于一个节点x,只有当它的直接儿子都放满石子时,才能将它直接儿子中的一个石子放置x上,并回收 ...

  10. zTree简单实现

    用zTree简单实现从后台传数据生成树 1.在jsp上引入js,jsp的head完整的部分 <%@ page language="java" contentType=&quo ...