bzoj3439 trie+可持久化线段树
挺好想的
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+可持久化线段树的更多相关文章
- BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树
题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- 【Luogu P3834】可持久化数组(可持久化线段树)
题目链接 可持久化线段树模板题. 这里总结一下可持久化线段树. 可持久化数据结构就是能恢复历史状态的数据结构,比如可持久化\(Trie\),并查集,平衡树. 可持久化数组是最基础的,这里通过可持久化线 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- 【BZOJ-2653】middle 可持久化线段树 + 二分
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1298 Solved: 734[Submit][Status][Discu ...
- HDU 4866 Shooting(持久化线段树)
view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...
- 【BZOJ-3653】谈笑风生 DFS序 + 可持久化线段树
3653: 谈笑风生 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 628 Solved: 245[Submit][Status][Discuss] ...
- 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树
没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...
随机推荐
- bootstrap-markdown编辑器引入
MarkdownAsset.php <?php namespace app\assets; use yii\web\AssetBundle; class MarkdownAsset extend ...
- 每个程序员都会的35个jQuery小技巧!
1. 禁止右键点击$(document).ready(function(){ $(document).bind("contextmenu",function(e){ return ...
- ubuntu搭建shad(-_-)owscoks(影梭)
准备步骤 apt-get updateapt-get install python-gevent python-pippip install shadowsocks 新建一个json文件内容如下,文件 ...
- jsp通过session传递checkbox中的值
获取checkbox中的值(第一个页面) <% String foodName[]=request.getParameterValues("chioce"); //“chio ...
- evil program
写的一个恶作剧程序,运行后直接重装系统吧,学习交流使用,后果自负. #include <windows.h> #pragma comment( linker, "/subsyst ...
- Gulp和Webpack工具的区别
引用知乎的回答:https://www.zhihu.com/question/37020798 怎么解释呢?因为 Gulp 和 browserify / webpack 不是一回事 Gulp应该和Gr ...
- 配置maven
http://www.cnblogs.com/liunanjava/archive/2015/11/05/4936037.html
- C# Chart控件,chart、Series、ChartArea曲线图绘制的重要属性
http://blog.sina.com.cn/s/blog_621e24e20101cp64.html 为避免耽误不喜欢这种曲线图效果的亲们的时间,先看一下小DEMO效果图: 先简单说一下,从图中可 ...
- 个人学习记录2:ajax跨域封装
/** * 跨域提交公用方法 * @param param 参数 * @param url 跨域的地址 * @param callFun 回调函数 callFun(data) */ function ...
- Python Day1
一.安装python windows 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装到C盘下 3.配置环境变量 右键计算机属性---高级系统设置 ...