Time:2016.05.07
Author:xiaoyimi
转载注明出处谢谢


传送门
思路:
1.have a trie,还得是倒着建的,记录每个结尾节点的id(可能会有重复,所以开一个vector记录一下)
2.对trie树进行dfs序,记录结尾节点的子树区间
3.建立主席树(由于权值就是id标号,所以不用离散化了)
4.1-n依次查询即可
注意:
dfs序在遇到结尾节点时才++记录序号的变量cnt,而且相同串的dfs序号是一样的(就是说一个结尾节点可能包含好多个不同编号的串),左区间取最前的一个(比如dfs到x节点,编号为2,x节点存着两个串,那么它们的左区间都为2,而序号要加两次)
代码:

#include<bits/stdc++.h>
using namespace std;
#define M 100004
#define ls(x) a[x].ch[0]
#define rs(x) a[x].ch[1]
int n,m,cnt,root=M*3-10;
int trie[M*3][26],num[M*3],Ls[M],Rs[M],data[M];
vector <int> q[M*3];
char s[M*3];
struct Chairman_tree
{int siz,ch[2];
}a[M*18];
int in()
{int t=0;char ch=getchar();while (!isdigit(ch)) ch=getchar();while (isdigit(ch)) t=(t<<3)+(t<<1)+ch-48,ch=getchar();return t;
}
void build(int now,int L,int R,int rt,int val)
{a[rt].siz=a[now].siz+1;if (L==R) return;int mid=(L+R)>>1;if (mid>=val)rs(rt)=rs(now),ls(rt)=++cnt,build(ls(now),L,mid,ls(rt),val);elsels(rt)=ls(now),rs(rt)=++cnt,build(rs(now),mid+1,R,rs(rt),val);
}
int get(int begin,int end,int L,int R,int k)
{if (begin==end) return end;int mid=(begin+end)>>1,t=a[ls(R)].siz-a[ls(L)].siz;if (k<=t)return get(begin,mid,ls(L),ls(R),k);elsereturn get(mid+1,end,rs(L),rs(R),k-t);
}
void insert(int id,char s[])
{int len=strlen(s),now=root;for (int i=len-1;i>=0;i--){if (!trie[now][s[i]-'a']) trie[now][s[i]-'a']=++cnt;now=trie[now][s[i]-'a'];}num[now]++;q[now].push_back(id);
}
void dfs(int x)
{if (num[x]){       for (int i=0;i<num[x];i++)Ls[q[x][i]]=cnt+1;for (int i=0;i<num[x];i++)data[++cnt]=q[x][i];}for (int i=0;i<26;i++)if (trie[x][i]) dfs(trie[x][i]);for (int i=0;i<num[x];i++)Rs[q[x][i]]=cnt;
}
main()
{n=in();for (int i=1;i<=n;i++)scanf("%s",s),insert(i,s);cnt=0;dfs(root);cnt=n+1;int k;for (int i=1;i<=n;i++) build(i,1,n,i+1,data[i]);for (int i=1;i<=n;i++){k=in();if (a[Rs[i]+1].siz-a[Ls[i]].siz<k) printf("-1\n");else printf("%d\n",get(1,n,Ls[i],Rs[i]+1,k));}
}

【BZOJ3439】Kpm的MC密码,trie树+dfs序+主席树相关推荐

  1. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)

    题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...

  2. 2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)

    题目链接:点击查看 题目大意:给出两棵以点 111 为根节点的有根树,现在要求满足条件的最大集合: 在第一棵树中,集合内的任意两个点都必须满足祖先关系,即 uuu 是 vvv 的祖先或 vvv 是 u ...

  3. 洛谷 - P4197 Peaks(Kruskal重构树+dfs序+主席树)

    题目链接:点击查看 题目大意:有 n 座山峰,每座山峰有他的高度 h[ i ] ,有些山峰之间有双向道路相连,共 m 条路径,每条路径有一个困难值,这个值越大表示越难走. 现在有 q 组询问,每组询问 ...

  4. nowcoder172C 保护 (倍增lca+dfs序+主席树)

    https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对 ...

  5. 2021牛客暑期多校训练营7 xay loves trees dfs序 + 主席树

    传送门 文章目录 题意: 思路: 题意: 给你两棵树,让你在第一棵树选一条最长的深度递增的链,链上每一个点在第二棵树上都不互为祖先. n≤3e5n\le3e5n≤3e5 思路: 之前做过差不多的题传送 ...

  6. BZOJ 3277 串 BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)...

    标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...

  7. New Year Tree(dfs序+线段树+二进制)

    题意: 给出一棵 n个节点的树,根节点为 1.每个节点上有一种颜色 ci.m次操作.操作有两种: 1 u c:将以 u为根的子树上的所有节点的颜色改为c. 2 u:询问以 u为根的子树上的所有节点的颜 ...

  8. 求和(dfs序+线段树)

    题意: 已知有n个节点,有n−1条边,形成一个树的结构. 给定一个根节点k,每个节点都有一个权值,节点i的权值为vi​. 给m个操作,操作有两种类型: 1 a x :表示将节点a的权值加上x 2 a ...

  9. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

最新文章

  1. mysql邮箱认证_邮箱验证功能的实现
  2. 图书网上商城blog
  3. stm32f103 低功耗调试笔记 低功耗模式下一直有个800多uA的电流
  4. 262. 行程和用户
  5. 【转】玩转git分支
  6. LINQ体验(6)——LINQ to SQL语句之Join和Order By
  7. opencv 读写XML YML
  8. 小技巧 ----- Java中指定保留几位小数
  9. 大数据的发展体现在哪些方面
  10. Wamp在重新装机后不想配置
  11. mysql查询优化~group by知多少
  12. 10条实用简洁的python代码,拿走即用(内附资料)
  13. ensp官方停止下载
  14. 广告公司测试软件题目,信息流广告测试题,看看你广告优化能力
  15. android仿微信浮窗的自动贴边可展开悬浮按钮
  16. 计算机哪些方向发展前景,计算机就业的几个方向
  17. DualVD:借鉴认知双向编码理论,提出视觉对话新框架 | AAAI 2020
  18. php 序列化转义冒号,Json数据中有冒号以及其它特殊字符序列化总结
  19. 风险中性的深度学习选股策略
  20. openwrt mysql改密码_openwrt的路由器重置root密码

热门文章

  1. JavaScript基础修炼(14)——WebRTC在浏览器中如何获得指定格式的PCM数据【华为云分享】
  2. Web安全-之文件上传漏洞场景
  3. 【Python3网络爬虫开发实战】1.3.3-pyquery的安装
  4. gradle命令无法识别
  5. CentOS Linux 7编译安装Redis
  6. Node.js抓取网页信息并展示(cheerio网络爬虫)
  7. stm32正交编码器 原理图_ROS机器人平台STM32底层控制部分
  8. Java 打印 99 乘法表
  9. mysql以下日期函数正确的_[数据库]MYSQL基础03(日期函数)
  10. html引入php文件中的函数,手把手教你在html中引入另一个html文件的方法(详解)...