题面

先把每个串反着插进$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树+线段树合并)的更多相关文章

  1. BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )

    把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...

  2. bzoj 3439: Kpm的MC密码 Trie+动态开点线段树

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3439 题解: 首先我们发现这道题要查的是后缀不是前缀. 如果查前缀就可以迅速查找到字符串 ...

  3. BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)

    题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...

  4. bzoj 3439 Kpm的MC密码(Trie+dfs序+主席树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...

  5. BZOJ 3439 Kpm的MC密码

    倒着建trie,然后主席树来求子树第k大. #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  6. 【BZOJ3439】Kpm的MC密码 Trie树+可持久化线段树

    [BZOJ3439]Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当 ...

  7. 【BZOJ3439】Kpm的MC密码 trie树+主席树

    Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身 ...

  8. 【BZOJ】【3439】Kpm的MC密码

    Trie树/可持久化线段树 神题啊……搞了我一下午= =(其实第233个提交也是我的) 我一开始的思路:这个找kpm串的过程,其实就跟在AC自动机上沿fail倒着往下走是差不多的(看当前是哪些点的后缀 ...

  9. 【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)

    3439: Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记 ...

随机推荐

  1. DJANGO之自定义模板过滤器

    我查找了DJANGO模板的过滤器,好像指定字符串包含指定关-键字符的过滤器没有呢, 没有硬着头-皮,按网上其它人的作法,写了一个,成功了...:) 参考URL: http://liuzhijun.it ...

  2. js的map文件

    什么是source map文件 source map文件是js文件压缩后,文件的变量名替换对应.变量所在位置等元信息数据文件,一般这种文件和min.js主文件放在同一个目录下. 比如压缩后原变量是ma ...

  3. ZOJ 3209

    精确覆盖 #include <iostream> #include <cstdio> #include <cstring> #include <algorit ...

  4. Javascript中的原型继承具体解释

    js中的继承,是面向对象的知识,由于js没有类的概念.所以继承是通过对象实现的.谈到继承.就必须说到prototype,就不得不先说下new的过程. 一个小小的列子: <script type= ...

  5. CCNP路由实验之十四 路由器的訪问控制ACL

     年9月1月12:00.还有一种时间叫做周期时间(periodic),即这个时间是会多次反复的.比方每周一,或者每周一到周五 ,"rotary 2″开启3002以此类推. 变成1,1变成 ...

  6. 例题 2-1 aabb 2-2 3n+1问题

    例题2-1  aabb 输出全部形如aabb的四位全然平方数(即前两位数字相等,后两位数字也相等) #include <stdio.h> #include <stdlib.h> ...

  7. [Linux]非常方便的上传下载文件工具rz和sz

     linux上非常方便的上传下载文件工具rz和sz (本文适合linux入门的朋友) [一般用于SecureCRT ssh中使用] █ 法一:直接用yum安装lrzsz(推荐) yum insta ...

  8. Ubuntu安装及ubuntu系统使用菜岛教程

    Ubuntu是一款广受欢迎的开源Linux发行版,和其他Linux操作系统相比,Ubuntu非常易用,和Windows相容性很好,非常适合Windows用户的迁移,在其八年的成长过程中已经获得了两千多 ...

  9. Eclipse打开ftl文件,高亮显示

    解决方式一:下载eclipse相关的freemarker插件 解决方式二:原生解决方式,方法特点无需下载插件,和eclipse编辑html和jsp文件一模一样 步骤: 1:windows---pref ...

  10. ijkplayer视频播放

      http://android-doc.com/androiddocs/2017/1018/5416.html https://www.2cto.com/kf/201801/714366.html ...