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 ...
随机推荐
- Spring.Net学习笔记(2)-依赖注入
一.开发环境 操作系统:Win10 编译器:VS2013 framework版本:.net 4.5 Spring版本:1.3.1 二.涉及程序集 Spring.Core.dll Common.Logg ...
- Java多线程——线程的死锁
Java多线程——线程的死锁 摘要:本文主要介绍了Java多线程中遇到的死锁问题. 部分内容来自以下博客: https://www.cnblogs.com/wy697495/p/9757982.htm ...
- jQuery四叶草菜单效果,跟360杀毒软件差不多
首先,我们要在js,css文件夹中创建js跟css,然后在body中写入html代码 <main><!--标签是 HTML 5 中的新标签. 素中的内容对于文档来说应当是唯一的.它不 ...
- 使用脚本快速线程转储及列出高cpu线程
jstack `ps -ef | grep java | grep bocai.jar | awk '{print $2}'` > cpu_high.logtop -b -n1 -Hp `ps ...
- 如何在网页中浏览和编辑DWG文件 梦想CAD控件
如何在网页中浏览和编辑DWG文件 梦想CAD控件 www.mxdraw.com 梦想绘图控件5.2 是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 201 ...
- elk大纲
一.ELK功能概览 1.检索 2.数据可视化--实时监控(实时刷新) nginx 访问量 ip地区分布图(大数据) 3.zabbix 微信联动报警 4.大数据日志分析平台(基于hadoop) 二.ka ...
- 批量生成随机字符串并保存到excel
需要导入jxl.jar,commons-lang-2.6.jar 链接:https://pan.baidu.com/s/1NPPh24XWxkka68x2JQYlYA 提取码:jvj3 链接:http ...
- list查询棚舍面积的时候,所有棚舍面积的value都是一样的
解决办法 将pickingid在查list之前set到对象中,通过id来匹配查询 具体代码: FarmHouse farmHouse=new FarmHouse(); farmHouse.setPic ...
- js中=,==,===的区别
= 赋值 == 先判断类型,在判断值,可以做类型转换 === 恒等判断
- vivo手机执行input命令提示killed
异常现象: 使用vivo手机时发现通过inputManager发送按键.执行屏幕滑动等动作失效,相关API并没有任何异常抛出,继续跟踪发现shell控制台执行input进行屏幕滑动.发送文本.模拟按键 ...