倒着建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. [mondrian] 快速入门

    一.下载地址 mondrian各个版本和工具等的下载地址: http://sourceforge.net/projects/mondrian/files/?source=navbar 注意:mondr ...

  2. HTML5自学笔记[ 15 ]canvas绘图基础6

    关于线条的一些属性: lineCap,这个属性表示的是线条两端的样式,值有butt(默认)/round/square. lineJoin,这个属性表示线条相交的方式,值有miter(默认)/bevel ...

  3. MVC之URL路由

    注册路由规则集合 一个 Web 应用具有一个全局的路由表,该路由表通过 System. Web.Routing.RouteTable的静态只读属性 Routes 表示,该属性返回一个类型为 Syste ...

  4. HDU 2602(01背包)

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. ThoughtWorks微服务架构交流心得

      ThoughtWorks微服务架构交流心得: (1)<人月神话>中谈到软件开发没有银弹,根源在于软件所解决的领域问题本身固有的复杂性,微服务正是从领域问题角度上进行服务拆分,来降低软件 ...

  6. cookie与sessionID之间的关系实验

    上一篇介绍了cookie,这里来看看cookie与sessionID之间有什么关系. 一.编写测试用例代码 新建一个servlet如下: public class SessionServlet ext ...

  7. loadrunner 参数化数据更新方式

    数据分配方式: Select next row[选择下一行]: 顺序(Sequential):按照参数化的数据顺序,一个一个的来取. 随机(Random):参数化中的数据,每次随机的从中抽取数据. 唯 ...

  8. 本地电脑localhost指向127.0.0.1的配置

    windows系统电脑,我们如果想访问本机部署的项目,通常使用的是localhost来指向本机,但是有时候发现不行,我们不妨打开资源管理器,C:\Windows\System32\drivers\et ...

  9. js克隆

    一.有什么用 不破坏原对象的属性 引入一些概念~ 原始数据类型(5种):undefined.null.number.string.boolean 引用数据类型(1种,也叫复合数据类型):object ...

  10. javascript之document对象

    一.修改网页元素 当使用document提供的方法和Element的属性得到网页元素之后,就可以对元素的内容进行修改,如下例所示的“全选/全不选”的实现. 例3-17 <html> < ...