题目大意:

  有n个字符串,编号为1~n,求每一个字符串在其他字符串中以它为后缀的字符串中编号第k小的字符串的编号。

思路:

  将字符串倒过来建Trie,记录每个结尾节点的编号(可能会有重复,所以开一个vector记录)。再对trie树进行dfs序,记录结尾节点的子树区间。区间第k小,自然用可持久化线段树(由于权值就是id,所以不用离散化)。 注意:dfs序在遇到结尾节点时才++记录序号的变量cnt,而且相同串的dfs序号是一样的(就是说一个结尾节点可能包含好多个不同编号的串),左区间取最前的一个(比如dfs到x节点,编号为2,x节点存着两个串,那么它们的左区间都为2,而序号要加两次)

参考自:http://blog.csdn.net/xym_CSDN/article/details/51340321

代码:

 #include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#define M 500009
using namespace std;
vector <int> q[M];
int cnt,trie[M][],num[M],com[M],out[M],dat[M],sum[M<<],lc[M<<],rc[M<<];
char s[M]; void ins(int id,char *str)
{
int i,l=strlen(str),j=,k;
for (i=l-;i>=;i--,j=trie[j][k])
if (!trie[j][k=str[i]-'a']) trie[j][k]=++cnt;
num[j]++; q[j].push_back(id);
} void dfs(int x)
{
int i;
for (i=;i<num[x];i++) com[q[x][i]]=cnt+;
for (i=;i<num[x];i++) dat[++cnt]=q[x][i];
for (i=;i<;i++) if (trie[x][i]) dfs(trie[x][i]);
for (i=;i<num[x];i++) out[q[x][i]]=cnt;
} void build(int l,int r,int cur,int _cur,int x)
{
sum[cur]=sum[_cur]+;
if (l==r) return; int mid=l+r>>;
if (x<=mid) lc[cur]=++cnt,rc[cur]=rc[_cur],build(l,mid,lc[cur],lc[_cur],x);
else lc[cur]=lc[_cur],rc[cur]=++cnt,build(mid+,r,rc[cur],rc[_cur],x);
} int ask(int L,int R,int l,int r,int k)
{
if (L==R) return L;
int mid=L+R>>,t=sum[lc[r]]-sum[lc[l]];
if (t>=k) return ask(L,mid,lc[l],lc[r],k);
else return ask(mid+,R,rc[l],rc[r],k-t);
} int main()
{
int n,i,x; scanf("%d",&n);
for (i=;i<=n;i++) scanf("%s",s),ins(i,s);
for (cnt=,dfs(),cnt=n+,i=;i<=n;i++) build(,n,i+,i,dat[i]);
for (i=;i<=n;i++)
{
scanf("%d",&x);
if (sum[out[i]+]-sum[com[i]]<x) printf("-1\n");
else printf("%d\n",ask(,n,com[i],out[i]+,x));
}
return ;
}

【bzoj3439】kpm的mc密码 题解的更多相关文章

  1. BZOJ3439: Kpm的MC密码

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

  2. BZOJ3439 Kpm的MC密码(可持久化trie)

    将串反过来就变成查询前缀了.考虑建一棵可持久化trie,查询时二分答案,均摊一下复杂度即为O(mlogn). #include<iostream> #include<cstdio&g ...

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

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

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

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

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

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

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

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

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

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

  8. 【bzoj3439】Kpm的MC密码 可持久化Trie树

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

  9. BZOJ-3439:Kpm的MC密码(Trie+DFS序+主席树)

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

随机推荐

  1. Lattice Diamond 和 ispLEVER 的不同之处

    Lattice Diamond 和 ispLEVER.有一些不同,尤其是如何管理工程的不同,包括以下几点: 1.ispLEVER 有多种工程类型,不同的程序文件类型需要不同的类型的工程:但是Diamo ...

  2. Android Attr -- Understanding Android Custom Attributes

    原文:http://androidbook.com/item/4169

  3. 【openGL】画直线

    #include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...

  4. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(三):配置ActiveXForm运行环境

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. 机器学习公开课笔记(5):神经网络(Neural Network)——学习

    这一章可能是Andrew Ng讲得最不清楚的一章,为什么这么说呢?这一章主要讲后向传播(Backpropagration, BP)算法,Ng花了一大半的时间在讲如何计算误差项$\delta$,如何计算 ...

  6. HDU 4005 The war Tarjan+dp

    The war Problem Description   In the war, the intelligence about the enemy is very important. Now, o ...

  7. pythonchallenge之C++学习篇-00

    前言 最近学习下C++,之前是python的用户,python解释器有诸多实现,其中最出名的要数C实现了,而且很多python的扩展模块可能要用C或者C++来写的,所以很有必要学习下C++了 为了避免 ...

  8. HeapSort自己yy-未完成

    #include <iostream> #include <cstdio> using namespace std; ; int a[maxn]; int HeapSize; ...

  9. 【MongoDB】1.安装--以及简单使用

    第一次接触MongoDB    参考&粘贴:http://jingyan.baidu.com/article/ed15cb1b52b8661be2698162.html 一.安装 1.首先去官 ...

  10. Loadrunner中关联的作用:

    获取并保存变化的request值{1.sessionid;2.获取上个请求的响应值,用于下个请求参数} 作为检查点 脚本调试工具