挺好想的

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. URL类

    java.net.URL类是对统一资源定位符(如http://www.lolcats.com)的抽象.它扩展了java.lang.Object,是一个final类.它采用策略模式,协议处理器(prot ...

  2. [Google Guava]字符串处理:连接器、拆分器、字符匹配器

    一.连接器[Joiner] 二.拆分器[Splitter] 三.字符匹配器[CharMatcher] 四.字符集[Charsets] Charsets:针对所有Java平台都要保证支持的六种字符集提供 ...

  3. redis 学习 01(下载 学习资源)

    1. windows 版 redis 下载地址 https://github.com/MSOpenTech/redis/releases 2. redis 实战源码 http://redisinact ...

  4. requestAnimationFrame,Web中写动画的另一种选择

    HTML5/CSS3时代,我们要在web里做动画选择其实已经很多了: 你可以用CSS3的animattion+keyframes; 你也可以用css3的transition; 你还可以用通过在canv ...

  5. 【BZOJ-2730】矿场搭建 Tarjan 双连通分量

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1602  Solved: 751[Submit][Statu ...

  6. java集合学生管理系统

    //student.java package com.sran.www; import java.util.Arrays; import java.util.Scanner; public class ...

  7. <<< 判断提交方式是get还是post

    if("GET".equals(request.getMethod())){ System.out.println("提交方式是GET"); }else if( ...

  8. AE开发使用内存图层

    AE开发中,有时需要从磁盘中读取一些文件信息如坐标点转为图层并进行分析,此过程并不需要坐标点入库之类的操作,就可以创建一个内存图层解决问题.创建内存图层需要用到InMemoryWorkspaceFac ...

  9. Interop with Native Libraries

    http://www.mono-project.com/docs/advanced/pinvoke/

  10. ExtJs 实现表单联动

    最近做的项目使用Extjs.遇到表单联动的业务.下面来说说主要实现思想: 说明:表单联动一般存在从属关系,有大范围的对象和大范围中的小对象.比如地理位置的选定(例:浙江省-杭州市-某某县).在这里,我 ...