倒着建trie,然后主席树来求子树第k大。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 300500
using namespace std;
int n,trie[maxn][],fath[maxn],cnt=,tag[maxn],k,rot,kr,dfn[maxn],mx[maxn],times=,line[maxn];
int tot=,ls[maxn<<],rs[maxn<<],sum[maxn<<];
char s[maxn];
vector <int> v[maxn],root[maxn];
void insert(int father,int &now,int l,int x)
{
if (!now) {now=++cnt;fath[now]=father;}
if (!l) {tag[x]=now;v[now].push_back(x);return;}
insert(now,trie[now][s[l-]-'a'+],l-,x);
}
void build(int &now,int left,int right)
{
now=++tot;
if (left==right) return;
int mid=left+right>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
}
void modify(int last,int &now,int left,int right,int pos)
{
now=++tot;sum[now]=sum[last]+;
if (left==right) return;
int mid=left+right>>;
ls[now]=ls[last];rs[now]=rs[last];
if (pos<=mid) modify(ls[last],ls[now],left,mid,pos);
else modify(rs[last],rs[now],mid+,right,pos);
}
int ask(int last,int now,int left,int right,int x)
{
if (sum[now]-sum[last]<x) return -;
if (left==right) return left;
int mid=left+right>>,lsum=sum[ls[now]]-sum[ls[last]];
if (x<=lsum) return ask(ls[last],ls[now],left,mid,x);
else return ask(rs[last],rs[now],mid+,right,x-lsum);
}
void dfs(int now)
{
dfn[now]=mx[now]=++times;line[times]=now;
for (int i=;i<=;i++)
{
if (trie[now][i])
{
dfs(trie[now][i]);
mx[now]=max(mx[now],mx[trie[now][i]]);
}
}
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%s",s);
insert(,rot,strlen(s),i);
}
dfs(rot);
build(kr,,n);root[].push_back();
for (int i=;i<=times;i++)
{
int now=line[i];
if (!v[now].size()) root[i].push_back(root[i-][root[i-].size()-]);
else
{
root[i].push_back(tot+);modify(root[i-][root[i-].size()-],kr,,n,v[now][]);
for (int j=;j<v[now].size();j++)
{
root[i].push_back(tot+);
modify(root[i][j-],kr,,n,v[now][j]);
}
}
}
for (int i=;i<=n;i++)
{
scanf("%d",&k);
int ret=tag[i];
printf("%d\n",ask(root[dfn[ret]-][root[dfn[ret]-].size()-],root[mx[ret]][root[mx[ret]].size()-],,n,k));
}
return ;
}

BZOJ 3439 Kpm的MC密码的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ 3439 Kpm的MC密码 (Trie树+线段树合并)

    题面 先把每个串反着插进$Trie$树 每个节点的子树内,可能有一些节点是某些字符串的开头 每个节点挂一棵权值线段树,记录这些节点对应的原来字符串的编号 查询的时候在线段树上二分即可 为了节省空间,使 ...

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

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

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

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

  8. BZOJ3439: Kpm的MC密码

    3439: Kpm的MC密码 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 166  Solved: 79[Submit][Status] Descr ...

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

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

随机推荐

  1. 35 个免费创新的响应式 HTML5 模板

    HTML5 和响应式都是 Web 开发领域中的热门技术,本文向你推荐 35 个免费的响应式 HTML5 模板,将两种技术完美结合. Mori responsive HTML5 Template Res ...

  2. java synchronized类锁,对象锁详解(转载)

    觉得还不错 留个记录,转载自http://zhh9106.iteye.com/blog/2151791 在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看 ...

  3. 企业级的响应式设计(Responsive design at enterprise level)译

    导言 响应式设计是现在人们谈论的热点,但如何部署,特别是在有多种设备的大型项目中如何组织响应式设计,响应式设计和可伸缩性(Scalable)有什么区别?这都是需要解决的难题. 优化用户经验——Opti ...

  4. 位运算取第一个非0的位 r & (~(r-1))

    Single Number III Given an array of numbers nums, in which exactly two elements appear only once and ...

  5. 利用ODBC从SQLServer向Oracle中导数据

    1.首先要在Oracle数据库中建对应的表,Oracle数据库中的字段类型和Sql Server 有所不同,Oracle中常用的有varchar2.integer.nchar.date,Sql Ser ...

  6. 简单管理用户SESSION小记(个人观点,欢迎斧正)

    做了几年码农,记录下一般涉及到用户session管理的方法. 问题说明: a.用户如果点击退出时,可以获取用户动作,这样可以销毁session. b.用户直接关闭浏览器或者直接意外关机情况,无法获取用 ...

  7. div垂直居中的问题

    工作和面试时常常会遇到怎么设置div垂直居中与浏览器中:包括固定宽高和不固定宽高的 1.固定宽高的div垂直居中 宽高固定的div很容易设置让其垂直居中 <div class="cen ...

  8. Js练习题之字数判断

    目标:控制某个栏目里每行字数,当字数超出时,以省略号显示 $("元素").each(function(){ var maxlength=9; //最大字数 if($(this).t ...

  9. 一个socket发送调试信息的类

    using UnityEngine; using System.Collections; using System; using System.Net.Sockets; using System.Ne ...

  10. CodeForces 86D(Yandex.Algorithm 2011 Round 2)

    思路:莫队算法,离线操作,将所有询问的左端点进行分块(分成sqrt(n) 块每块sqrt(n)个),用左端点的块号进行排序小的在前,块号相等的,右端点小的在前面. 这样要是两个相邻的查询在同一块内左端 ...