BZOJ 3439 Kpm的MC密码 (Trie树+线段树合并)
先把每个串反着插进$Trie$树
每个节点的子树内,可能有一些节点是某些字符串的开头
每个节点挂一棵权值线段树,记录这些节点对应的原来字符串的编号
查询的时候在线段树上二分即可
为了节省空间,使用线段树合并
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 100100
#define M1 (N1*3)
#define idx(X) (X-'a')
using namespace std; char str[M1];
int a[N1],n; struct SEG{
int sz[N1*],ls[N1*],rs[N1*],root[M1],tot;
inline void pushup(int rt){ sz[rt]=sz[ls[rt]]+sz[rs[rt]]; }
void update(int x,int l,int r,int &rt,int w)
{
if(!rt) rt=++tot;
if(l==r){ sz[rt]+=w; return; }
int mid=(l+r)>>;
if(x<=mid) update(x,l,mid,ls[rt],w);
else update(x,mid+,r,rs[rt],w);
pushup(rt);
}
int merge(int l,int r,int r1,int r2)
{
if(!r1||!r2) return r1+r2;
int mid=(l+r)>>,rt=++tot;
//sz[rt]=sz[r1]+sz[r2];
ls[rt]=merge(l,mid,ls[r1],ls[r2]);
rs[rt]=merge(mid+,r,rs[r1],rs[r2]);
pushup(rt);
return rt;
}
int query(int l,int r,int rt,int K)
{
if(K>sz[rt]) return -;
if(l==r) return l;
int mid=(l+r)>>;
if(K>sz[ls[rt]]) return query(mid+,r,rs[rt],K-sz[ls[rt]]);
else return query(l,mid,ls[rt],K);
}
}s; namespace Trie{
int ch[M1][],dep[M1],fa[M1],tot;
vector<int>ed[M1];
void insert(int len,int id,int *pos)
{
int x=,c,i;
for(i=len;i>=;i--)
{
c=idx(str[i]);
if(!ch[x][c])
ch[x][c]=++tot,dep[tot]=dep[x]+,fa[tot]=x;
x=ch[x][c];
}
ed[x].push_back(id);
pos[id]=x;
}
int hs[M1],que[M1];
void build()
{
int i,j,id,x;
for(i=;i<=tot;i++) hs[dep[i]]++;
for(i=;i<=tot;i++) hs[i]+=hs[i-];
for(i=;i<=tot;i++) que[hs[dep[i]]--]=i;
for(i=tot;i>=;i--)
{
x=que[i];
for(j=;j<ed[x].size();j++)
{
id=ed[x][j];
s.update(id,,n,s.root[x],);
}
}
for(i=tot;i>=;i--)
{
x=que[i];
s.root[fa[x]]=s.merge(,n,s.root[x],s.root[fa[x]]);
}
}
}; int pos[M1];
int main()
{
scanf("%d",&n);
int i,j,k,cnt,L;
for(i=;i<=n;i++)
{
scanf("%s",str+);
L=strlen(str+);
Trie::insert(L,i,pos);
}
Trie::build();
for(i=;i<=n;i++)
{
scanf("%d",&a[i]);
printf("%d\n",s.query(,n,s.root[pos[i]],a[i]));
}
return ;
}
BZOJ 3439 Kpm的MC密码 (Trie树+线段树合并)的更多相关文章
- BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )
把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...
- bzoj 3439: Kpm的MC密码 Trie+动态开点线段树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3439 题解: 首先我们发现这道题要查的是后缀不是前缀. 如果查前缀就可以迅速查找到字符串 ...
- BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)
题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...
- bzoj 3439 Kpm的MC密码(Trie+dfs序+主席树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...
- BZOJ 3439 Kpm的MC密码
倒着建trie,然后主席树来求子树第k大. #include<iostream> #include<cstdio> #include<cstring> #inclu ...
- 【BZOJ3439】Kpm的MC密码 Trie树+可持久化线段树
[BZOJ3439]Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当 ...
- 【BZOJ3439】Kpm的MC密码 trie树+主席树
Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身 ...
- 【BZOJ】【3439】Kpm的MC密码
Trie树/可持久化线段树 神题啊……搞了我一下午= =(其实第233个提交也是我的) 我一开始的思路:这个找kpm串的过程,其实就跟在AC自动机上沿fail倒着往下走是差不多的(看当前是哪些点的后缀 ...
- 【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)
3439: Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记 ...
随机推荐
- DJANGO之自定义模板过滤器
我查找了DJANGO模板的过滤器,好像指定字符串包含指定关-键字符的过滤器没有呢, 没有硬着头-皮,按网上其它人的作法,写了一个,成功了...:) 参考URL: http://liuzhijun.it ...
- js的map文件
什么是source map文件 source map文件是js文件压缩后,文件的变量名替换对应.变量所在位置等元信息数据文件,一般这种文件和min.js主文件放在同一个目录下. 比如压缩后原变量是ma ...
- ZOJ 3209
精确覆盖 #include <iostream> #include <cstdio> #include <cstring> #include <algorit ...
- Javascript中的原型继承具体解释
js中的继承,是面向对象的知识,由于js没有类的概念.所以继承是通过对象实现的.谈到继承.就必须说到prototype,就不得不先说下new的过程. 一个小小的列子: <script type= ...
- CCNP路由实验之十四 路由器的訪问控制ACL
年9月1月12:00.还有一种时间叫做周期时间(periodic),即这个时间是会多次反复的.比方每周一,或者每周一到周五 ,"rotary 2″开启3002以此类推. 变成1,1变成 ...
- 例题 2-1 aabb 2-2 3n+1问题
例题2-1 aabb 输出全部形如aabb的四位全然平方数(即前两位数字相等,后两位数字也相等) #include <stdio.h> #include <stdlib.h> ...
- [Linux]非常方便的上传下载文件工具rz和sz
linux上非常方便的上传下载文件工具rz和sz (本文适合linux入门的朋友) [一般用于SecureCRT ssh中使用] █ 法一:直接用yum安装lrzsz(推荐) yum insta ...
- Ubuntu安装及ubuntu系统使用菜岛教程
Ubuntu是一款广受欢迎的开源Linux发行版,和其他Linux操作系统相比,Ubuntu非常易用,和Windows相容性很好,非常适合Windows用户的迁移,在其八年的成长过程中已经获得了两千多 ...
- Eclipse打开ftl文件,高亮显示
解决方式一:下载eclipse相关的freemarker插件 解决方式二:原生解决方式,方法特点无需下载插件,和eclipse编辑html和jsp文件一模一样 步骤: 1:windows---pref ...
- ijkplayer视频播放
http://android-doc.com/androiddocs/2017/1018/5416.html https://www.2cto.com/kf/201801/714366.html ...