BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树
题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号
首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号
然后考虑对字符串排序 那么对于每一个字符串以它为前缀的字符串一定是连续的 那么就转化成了区间第k小 这个用可持久化线段树能够解决
排序自然不能直接排 既然是字符串 考虑Trie树+DFS就可以 注意字符串有反复的 小心
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
struct Trie{
vector<int> num;
Trie *son[26];
void* operator new (size_t size);
}*root,*mempool,*C;
struct Segtree{
Segtree *ls,*rs;
int num;
void* operator new (size_t size,Segtree *_,Segtree *__,int ___);
}*tree[M],*_mempool,*G;
int n,a[M],l[M],r[M],tot;
char s[M];
void* Trie :: operator new (size_t size)
{
if(C==mempool)
{
C=new Trie[1<<15];
mempool=C+(1<<15);
memset(C,0,sizeof(Trie)*(1<<15) );
}
return C++;
}
void* Segtree :: operator new (size_t size,Segtree *_,Segtree *__,int ___)
{
if(G==_mempool)
{
G=new Segtree[1<<15];
_mempool=G+(1<<15);
memset(G,0,sizeof(Segtree)*(1<<15) );
}
G->ls=_;
G->rs=__;
G->num=___;
return G++;
}
void Insert(Trie*&p,char *str,int pos)
{
if(!p) p=new Trie;
if(!*str)
{
p->num.push_back(pos);
return ;
}
Insert(p->son[(*str)-'a'],str+1,pos);
}
void DFS(Trie *p)
{
int i;
vector<int>::iterator it;
p->num.begin();
int temp=tot+1;
for(it=p->num.begin();it!=p->num.end();it++)
{
a[++tot]=*it;
l[*it]=temp;
}
for(i=0;i<26;i++)
if(p->son[i])
DFS(p->son[i]);
for(it=p->num.begin();it!=p->num.end();it++)
r[*it]=tot;
}
Segtree* Build_Tree(Segtree *p,int x,int y,int val)
{
int mid=x+y>>1;
if(x==y) return new (0x0,0x0,p->num+1) Segtree;
if(val<=mid) return new (Build_Tree(p->ls,x,mid,val),p->rs,p->num+1) Segtree;
else return new (p->ls,Build_Tree(p->rs,mid+1,y,val),p->num+1) Segtree;
}
int Get_Ans(Segtree *p1,Segtree *p2,int x,int y,int k)
{
int mid=x+y>>1;
if(x==y) return mid;
int temp=p2->ls->num-p1->ls->num;
if(k<=temp) return Get_Ans(p1->ls,p2->ls,x,mid,k);
else return Get_Ans(p1->rs,p2->rs,mid+1,y,k-temp);
}
int main()
{
int i,j,k;
cin>>n;
for(i=1;i<=n;i++)
{
scanf("%s",s+1);
int temp=strlen(s+1);
for(j=1;j<<1<=temp;j++)
swap(s[j],s[temp+1-j]);
Insert(root,s+1,i);
}
DFS(root);
tree[0]=new (0x0,0x0,0) Segtree;
tree[0]->ls=tree[0]->rs=tree[0];
for(i=1;i<=n;i++)
tree[i]=Build_Tree(tree[i-1],1,n,a[i]);
for(i=1;i<=n;i++)
{
scanf("%d",&k);
if(k>r[i]-l[i]+1) puts("-1");
else printf("%d\n", Get_Ans(tree[l[i]-1],tree[r[i]],1,n,k) );
}
}
BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树的更多相关文章
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- [BZOJ 4771]七彩树(可持久化线段树+树上差分)
[BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...
- BZOJ.4771.七彩树(可持久化线段树)
BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- BZOJ 2588: Spoj 10628. Count on a tree-可持久化线段树+LCA(点权)(树上的操作) 无语(为什么我的LCA的板子不对)
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 9280 Solved: 2421 ...
- 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树
为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...
- BZOJ 4771: 七彩树 可持久化线段树+树链的并
这个思路挺有意思的 ~ 利用树链的并来保证每个颜色只贡献一次,然后用可持久化线段树维护 code: #include <set> #include <cstdio> #incl ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...
随机推荐
- MySQL详解(25)-----------MySQL性能优化
1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响.MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性 ...
- iOS UI布局总结
布局就是尺寸和位置的设置. 一.基本布局: 1)绝对布局:frame.layoutsubviews. 二.相对布局: autoresizing.autolayout.基于父视图.基于约束. 三.线性布 ...
- 通过acdbblockreference 获得块名
AcDbBlockReference *pBlkRef = AcDbBlockReference::cast(ent.object()); AcDbObjectId pBlkTblRecId; ...
- java虚拟机(七)--java内存模型JMM
本文参考慕课网相关视频和博客https://mp.weixin.qq.com/s/tV0MfDdJqGwGMHCIkqnAgA,图也是这个博客的,这篇只是自己的简单总结,想要深 入理解可以访问这两块内 ...
- datagrid总条数
1.getData var data=$("#dg").datagrid("getData");alert('总数据量:' + data.total)//注意你 ...
- 面向对象程序设计--Java语言第一周编程题:分数
分数 题目内容: 设计一个表示分数的类Fraction.这个类用两个int类型的变量分别表示分子和分母. 这个类的构造函数是: Fraction(int a, int b) 构造一个a/b的分数. 这 ...
- php第二十七节课
注册审核 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- Bookshelf 2(poj3628,01背包,dp递推)
题目链接:Bookshelf 2(点击进入) 题目解读: 给n头牛,给出每个牛的高度h[i],给出一个书架的高度b(所有牛的高度相加>书架高度b),现在把一些牛叠起来(每头牛只能用一次,但不同的 ...
- 08css、JS
08.css.JS-2018/07/18 1.css的属性 文字属性:font-size:大小,font-family字体类型,font-color:颜色 文本颜色:color:颜色,test-dec ...
- Session共享实现方案调研
1.背景 随 着互联网的日益壮大,网站的pv和uv成线性或者指数倍的增加.单服务器单数据库早已经不能满足实际需求.目前大多数大型网站的服务器都采用了分布式服务 集群的部署方式,所谓集群,就是让一组计算 ...