挺好想的

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. JavaScript禁用回退

    javascript:window.history.forward(1); 比如:当前在B页面,点击后退会回退到A页面,那么该代码写在A页面,然后在B页面就不会回退到A了.

  2. Synchronized

    1. 在编写一个类时,如果该类中的代码可能运行与多线程环境下,就要考虑同步问题了. 会同时被多个线程访问的资源,就是竞争资源,也称为竞争条件.对于多线程共享的资源我们必须进行同步,以避免一个线程的改动 ...

  3. 走进AngularJs(一)angular基本概念的认识与实战

    一.前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,作为一名业界新秀,紧跟时代潮流,学习掌握新知识自然是不敢怠慢.当听到AngularJs这个名字并知道是google在维 ...

  4. js整数补零

    /* * * 整数前面补零 * * 质朴长存法 * num 要补灵的整数 * n个数,比整数位数多前面自动补零 * **/ function pad(num, n) { var len = num.t ...

  5. CSS书写顺序

    CSS书写顺序 1.位置属性(position, top, right, z-index, display, float等)2.大小(width, height, margin, padding)3. ...

  6. windows下pip安装python模块时报错总结

    http://www.cnblogs.com/liaojiafa/p/5100550.html 前言: 这几天把python版本升级后,发现pip安装模块好多都报错(暂不确定是不是因为升级导致的),我 ...

  7. AE开发实现GP工具IDW

    IDW——空间插值 IDW(Inverse Distance Weighted)是一种常用而简便的空间插值方法,它以插值点与样本点间的距离为权重进行加权平均,离插值点越近的样本点赋予的权重越大. 设平 ...

  8. mod-mono

    http://go-mono.com/config-mod-mono/  配置文件生成器 Mono remote debugging from Visual Studio http://stackov ...

  9. 多线程之GCD

    什么是GCD Grand Central Dispatch 是Apple开发的一种多核编程技术.主要用于优化应用程序以支持多核处理器以及其他多对称处理系统TA会自动管理线程的生命周期(创建线程.调度任 ...

  10. 跟随 Web 标准探究DOM -- Node 与 Element 的遍历

    写在前面 这篇没有什么 WebKit 代码的分析,因为……没啥好分析的,在实现里无非就是树的(先序DFS)遍历而已,囧哈哈哈……在WebCore/dom/Node.h , WebCore/dom/Co ...