挺好想的

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. 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github

    4月28日,已增加多媒体上传及下载API,对应MediaUploadRequest和MediaGetRequest ------------------------------------------ ...

  2. JavaScript实现计算两个日期之间的天数

    以“yyyy-MM-dd”格式为例,现在有两个日期,分别为“2006-01-01”,“2007-05-20”. 1.调用Date.parser()方法,将字符串格式的时间戳转换为Date类型时间对象: ...

  3. 移动web开发—页面头部 META 总结

    meta指元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. 标签位于文档的头部,不包含任何内容. 标签的属性定义了与文档相关联的名称/值对. ...

  4. cosbench 异常 FreeMarker template error: The following has evaluated to null or missing

    问题现象: 使用Cosbench 0.4.2.c4 版本测试Ceph RGW read test失败,遇到异常如下: FreeMarker template error: The following ...

  5. redis-windows执行redis-cli查询

    1.无密码时的访问 redis-cli -h redis > redis > keys *1) "myset"2) "mysortset" redi ...

  6. 什么是js面向对象??

    简单的来说就是键值对,写一个函数,然后传值进去,   function Person(name,age){           this.name = name;           this.age ...

  7. 【poj1742】 Coins

    http://poj.org/problem?id=1742 (题目链接) 题意 给出n钟纸币,每种纸币面值为a[i],数量为c[i],问能够成多少数值小于等于m的数. Solution 先想到了容斥 ...

  8. Python【第三章】:python 面向对象 (new)

    面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...

  9. gulp-rev同时将js和css文件写在一个rev-manifest.json文件里面的方式探讨

    参考: https://segmentfault.com/q/1010000002876613 https://github.com/sindresorhus/gulp-rev 测试发现,在官网上最主 ...

  10. Bzoj2850 巧克力王国

    Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 505  Solved: 204 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但 ...