倒着建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. 30 个有用的 HTML5 和 CSS3 表单设计

    基本上表单是任何一个网站都必须要用到的元素,本文介绍的这 30 个设计方案供你参考,这些方案如果要单独下载完整可运行的文件则需要支付2-5美元的费用. 1. Fresh Forms 2. Pretty ...

  2. [backbone] Getting Started with Backbone.js

    一.简介 Backbone 是一个 JavaScript MVC 框架,它属于轻量级框架,且易于学习掌握.模型.视图.集合和路由器从不同的层面划分了应用程序,并负责处理几种特定事件.处理 Ajax 应 ...

  3. iOS开发数据库SQLite的使用

    iOS系统自带Core Data来进行持久化处理,而且Core Data可以使用图形化界面来创建对象,但是Core Data不是关系型数据库,对于Core Data来说比较擅长管理在设备上创建的数据持 ...

  4. (09)odoo工作流

    --------------修订时间14:54 2016-09-18 星期日21:59 2016-06-12 星期日10:06 2016-02-24 星期三17:14 2016-01-29 星期五-- ...

  5. GetMemory

    在函数中动态申请内存(虚拟内存,堆),利用指针返回值指向申请的内存.

  6. C++ 与设计模式学习(其一)

    记得曾经一年前,听到同学再说设计模式,当时觉得不怎么重要,所以就没有去系统的学习,这一放,就是一年,直到前段时间,面试了一个阿里巴巴的职位,要我谈谈对于设计模式的看法. 之后就好好了看了一些文章,好好 ...

  7. hdu----(5045)Contest(数位dp)

    Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  8. 百度地图API:利用瓦片生成工具,自定义背景图片

    参考酸奶小妹的博文<[百度地图API]如何制作一张魔兽地图!!——CS地图也可以,哈哈哈> (http://www.cnblogs.com/milkmap/archive/2011/05/ ...

  9. SAP本地文件策略(导EXCEL选择拒绝后处理)

    导出EXCEL意外选择了拒绝+记住选择,这样的话在本地电脑就导不出文件了,如下图: 解决办法有2个: 1,修改导出文件的本地策略 :Alt+F12 ->选项->安全性->安全设置-& ...

  10. 如何打开asp.net中的出错提示?在程序发布后

    答案:修改其中的一个配置节点,<customErrors mode="On"/>