【HDU - 5790 】Prefix(主席树+Trie树)
BUPT2017 wintertraining(15) #7C
题意
求[min((Z+L)%N,(Z+R)%N)+1,max((Z+L)%N,(Z+R)%N)+1]中不同前缀的个数,Z是上次询问的结果,N是字符串总个数。Q次询问。
题解
用主席树,即函数式线段树,维护前i个字符串的区间和(每个区间的前缀个数之和)。
读入每个字符串后,用Trie树给它的每个前缀分配ID,并记录每个前缀最后出现的位置pre[cur],如果当前的前缀出现过,则线段树中上一次出现的位置的值-1,相当于只把这种前缀记录在最后出现的位置上。然后当前位置(第几个字符串)贡献了字符串长度个前缀。
那么求[L,R]就相当于求前R个字符串对应的线段树的区间[L,n]的值,因为这样肯定不会包含只在R后面出现的前缀,而前R个字符串对应的线段树(主席树就相当于n个线段树),每个前缀只在最后出现的位置上有贡献,于是它[L,n]一定包含所有这个区间出现的前缀。
代码
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
const int N=100005;
const int M=N*40;
using namespace std;
namespace PST{
int T[N],lson[M],rson[M],tot,c[M],n;
void init(int _n){
tot=0;
n=_n;
memset(c,0,sizeof c);
}
int build(int l,int r){
++tot;
c[tot]=0;
if(l<r){
int mid=l+r>>1;
lson[tot]=build(l,mid);
rson[tot]=build(mid+1,r);
}
return tot;
}
int update(int root,int pos,int val){
int newroot=++tot, tmp=tot;
c[tmp]=c[root]+val;
int l=1,r=n;
while(l<r){
int mid=l+r>>1;
if(pos<=mid){
lson[newroot]=++tot; rson[newroot]=rson[root];
root=lson[root];
r=mid;
}
else{
rson[newroot]=++tot; lson[newroot]=lson[root];
root=rson[root];
l=mid+1;
}
newroot = tot;
c[newroot] = c[root] + val;
}
return tmp;
}
int query(int root,int pos){
int ret=0;
int l=1,r=n;
while(l<pos){
int mid=l+r>>1;
if(pos<=mid){
ret+=c[rson[root]];
r=mid;
root=lson[root];
}
else{
l=mid+1;
root=rson[root];
}
}
return c[root]+ret;
}
}
namespace Trie{
int node[N][27];
int tot, pre[N];
void Insert(string& s,int x){
int cur=0;
for(int i=0;i<s.size();++i){
int p=s[i]-'a';
if(node[cur][p]==0)
node[cur][p]=++tot;
cur=node[cur][p];
if(pre[cur]){
PST::T[x]=PST::update(PST::T[x], pre[cur], -1);
}
pre[cur]=x+1;
}
}
void init(){
tot=0;
memset(node,0,sizeof node);
memset(pre,0,sizeof pre);
}
}
string s;
int main(){
int n;
while(~scanf("%d",&n)){
int z=0;
Trie::init();
PST::init(n);
PST::T[0]=PST::build(1,n);
for(int i=0;i<n;++i){
if(i)PST::T[i]=PST::T[i-1];
cin>>s;
Trie::Insert(s, i);
PST::T[i]=PST::update(PST::T[i], i+1, s.size());
}
int q;
scanf("%d",&q);
while(q--){
int l,r;
scanf("%d%d",&l,&r);
l=(l+z)%n,r=(r+z)%n;
if(r<l)swap(l,r);
z=PST::query(PST::T[r],l+1);
printf("%d\n",z);
}
}
return 0;
}
【HDU - 5790 】Prefix(主席树+Trie树)的更多相关文章
- Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结
Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...
- 字典树(Trie树)的实现及应用
>>字典树的概念 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.与二叉查找树不同,Trie树的 ...
- [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序
一. 题目 487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 274040 Accepted: 48891 ...
- 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树
正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...
- luoguP6623 [省选联考 2020 A 卷] 树(trie树)
luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...
- HDU 5790 Prefix(字典树+主席树)
Prefix Time Limit: 2000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Sub ...
- hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法
Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...
- hdu 1251:统计难题[【trie树】||【map】
<题目链接> 统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131 ...
- HDU 4825 Xor Sum (trie树处理异或)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
随机推荐
- mysql数据的导入和导出
一. mysqldump工具基本用法,不适用于大数据备份 1. 备份所有数据库: mysqldump -u root -p --all-databases > all_database_sq ...
- Day14 Python基础之os/sys/hashlib模块(十二)
os模块 os.getcwd() #获取当前工作路径 os.chdir(‘dirname1/dirname2/dirname3’) #改变当前脚本的工作路径,相当于cmd下的cd os.makedi ...
- 《梦断代码》Scott Rosenberg著(三)
开放与封闭之论: 程序源代码是商业软件公司最重要的资产,所以软件公司售卖二进制文件.这样也就意味着如果微软的软件产品出了问题,即便你是一个程序大牛也无法修复它.你只能等着微软来修正问题,因为只有微软程 ...
- Redis Sentinel 集群搭建常见注意事项
我的配置: 1个master,1个slave,3个sentinel 搭建的过程网上已经有很多了,这里列几个重点关注: 修改sentinel.conf的protected-mode与redis.conf ...
- 【学习总结】Git学习-参考廖雪峰老师教程十-自定义Git
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- K8S、云计算、大数据、编程语言
云计算.大数据.编程语言学习指南下载,100+技术课程免费学!这份诚意满满的新年技术大礼包,你Get了吗?-云栖社区-阿里云https://yq.aliyun.com/articles/691028 ...
- jvisualvm中VisualGC插件提示:不受此JVM支持
Visual GC插件「不受此JVM支持」问题 - djp567的博客 - CSDN博客https://blog.csdn.net/djp567/article/details/78662047 jv ...
- ansible的playbook简单使用
一.介绍 playbook就是一个用yaml语法把多个模块堆起来的一个文件 核心组件: Hosts:执行的远程主机列表Tasks:任务,由模块定义的操作的列表:Varniables:内置变量或自定义变 ...
- DNS_PROBE_FINISHED_NXDOMAIN & MacOS
DNS_PROBE_FINISHED_NXDOMAIN 内网 DNS bug 8.8.8.8 8.8.4.4 # new inner Wi-Fi 10.1.3.10 10.1.3.13 Windows ...
- EmpireCMS的使用
1.下载安装empirecms 下载完成后解压将upload目录整体上传到服务器,并更名为empirecms_test 更改目录文件的权限: chmod -R 777 empirecms_test 配 ...