题面

先把每个串反着插进$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. JavaFX本地应用自己主动更新功能的实现FXLauncher

    JavaFX本地应用自己主动更新功能的实现--FXLauncher 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 一. ...

  2. Anaconda安装第三方模块

    Anaconda安装第三方模块 普通安装: 进去\Anaconda\Scripts目录,conda install 模块名 源码安装: 进去第三方模块目录,python install setup.p ...

  3. How to fix yum errors on CentOS, RHEL or Fedora

    Yum is a package management tool for installing, updating and removing rpm packages on RedHat-based ...

  4. 利用LruCache载入网络图片实现图片瀑布流效果(改进版)

    PS: 2015年1月20日21:37:27 关于LoadImageAsyncTask和checkAllImageViewVisibility可能有点小bug 改动后的代码请參见升级版本号的代码 ht ...

  5. Node.js:教程

    ylbtech-Node.js:教程 1.返回顶部 1. Node.js 教程 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaS ...

  6. Hadoop MapReduce编程 API入门系列之MapReduce多种输出格式分析(十九)

    不多说,直接上代码. 假如这里有一份邮箱数据文件,我们期望统计邮箱出现次数并按照邮箱的类别,将这些邮箱分别输出到不同文件路径下. 代码版本1 package zhouls.bigdata.myMapR ...

  7. 大数据查询——HBase读写设计与实践--转

    背景介绍 本项目主要解决 check 和 opinion2 张历史数据表(历史数据是指当业务发生过程中的完整中间流程和结果数据)的在线查询.原实现基于 Oracle 提供存储查询服务,随着数据量的不断 ...

  8. 移动端 fixed 固定按钮在屏幕下方,然后按钮被键盘顶上来...顶上来了有没有~

    在移动端 H5 页面开发中,我使用了 fixed 固定某个元素在屏幕的最下方, 这时点击输入框,接着非常非常自然地出现了元素被系统键盘顶起来的情况,如下图. 解决方案: 首先,给页面最外层包裹一层 d ...

  9. hibernate dao 公共方法

    package com.dao.impl; import java.lang.reflect.ParameterizedType; import java.util.Collection; impor ...

  10. 数据结构——单链表java简易实现

    巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...