Prefix HDU - 5790 字典树 + 主席树
传送门
文章目录
- 题意:
- 思路:
题意:
给你nnn个串,每次询问一个区间,返回这个区间的串的不同的前缀个数,强制在线。
思路:
碰到字符串前缀的问题,我们自然的想到用字典树来解决。
对于每个串,我们将其插入字典树的时候记一下当前串的每个前缀的ididid,我们可以将问题就转化成询问区间内出现数字的个数(即出现的ididid),因为要强制在线,我们考虑用主席树维护历史信息。
对于维护区间内出现数字的个数,这是个经典问题了,维护前缀出现的最后一个位置即可。查询的时候直接查询第rrr棵树的区间和即可。
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=200110,mod=1e9+7,INF=0x3f3f3f3f;
const int P=131;
const double eps=1e-6;int n,m;
int root[N],tot;
int idx,num[N*5],tree[N][26],id,st[N*5];
int pre[N*5];
char s[N];
struct Node
{int l,r;int cnt;
}tr[N*40];int newnode()
{idx++;for(int i=0;i<26;i++) tree[idx][i]=0;num[idx]=0;return idx;
}void add()
{int p=0;for(int i=0;s[i];i++){int now=s[i]-'a';if(!tree[p][now]) tree[p][now]=newnode();p=tree[p][now];if(!num[p]) num[p]=++id;st[i]=num[p];}
}void insert(int p,int &q,int l,int r,int pos,int x)
{q=++tot; tr[q]=tr[p];tr[q].cnt+=x;if(l==r) return;int mid=l+r>>1;if(pos<=mid) insert(tr[p].l,tr[q].l,l,mid,pos,x);else insert(tr[p].r,tr[q].r,mid+1,r,pos,x);
}int query(int u,int l,int r,int ql,int qr)
{if(!u) return 0;if(l>=ql&&r<=qr) return tr[u].cnt;int ans=0,mid=l+r>>1;if(ql<=mid) ans+=query(tr[u].l,l,mid,ql,qr);if(qr>mid) ans+=query(tr[u].r,mid+1,r,ql,qr);return ans;
}int main()
{// ios::sync_with_stdio(false);
// cin.tie(0);memset(pre,-1,sizeof(pre));while(scanf("%d",&n)!=EOF){memset(tree,0,sizeof(tree));idx=tot=id=0;for(int i=1;i<=n;i++){scanf("%s",s);add();root[i]=root[i-1];for(int j=0;s[j];j++){if(pre[st[j]]==-1) insert(root[i],root[i],1,n,i,1);else{insert(root[i],root[i],1,n,pre[st[j]],-1);insert(root[i],root[i],1,n,i,1);}pre[st[j]]=i;}}scanf("%d",&m);int ans=0;while(m--){int ll,rr; scanf("%d%d",&ll,&rr);int l=min((ll+ans)%n,(rr+ans)%n)+1;int r=max((ll+ans)%n,(rr+ans)%n)+1;printf("%d\n",ans=query(root[r],1,n,l,r));}for(int i=1;i<=id;i++) pre[i]=-1;}return 0;
}
/**/
Prefix HDU - 5790 字典树 + 主席树相关推荐
- 线段树简单入门 (含普通线段树, zkw线段树, 主席树)
线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...
- HDU 5919 Sequence II 主席树
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5919 Sequence II Time Limit: 9000/4500 MS (Java/Othe ...
- HDU - 5919 Sequence II——主席树+区间种类++逆序建树
[题目描述] HDU - 5919 Sequence II [题目分析] 题目给定一个数组,每次查询一个区间,找出区间内不同数字的个数x,然后输出按出现顺序第x/2向上取整个数字的位置. 按照要求,我 ...
- HDU - 4348To the moon——主席树+区间修改
HDU - 4348To the moon [题目描述] [题目分析] 题目中说明每次更新后时间都会加1,而且还会需要查询以前的区间,还会需要返回以前的时间,所以是很裸的主席树.区间查询的话我们同样需 ...
- HDU - 4417 Super Mario(主席树/线段树+离线)
题目链接:点击查看 题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个 题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用 ...
- HDU - 5919 Sequence II(主席树+思维)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,再给出 m 次询问,每次询问给出一个区间 [ l , r ] ,问区间 [ l , r ] 内首次出现的数字的位置的中位数 题目分析:题 ...
- HDU - 5788 Level Up(主席树+dfs序+树状数组)
题目链接:点击查看 题目大意:给出一棵有向树,每个节点都有一个初始的权值 a[ i ] ,和一个通过计算得到的权值 mid[ i ] ,mid 数组的计算方法如下:mid[ u ] 为结点 u 及其子 ...
- HDU 6703 array(主席树 + set)
array 给一个全排列,接下来有两种操作: 一.把pospospos位置上的值+10,000,000+10,000,000+10,000,000. 二.查询[1,r][1, r][1,r]区间,没有 ...
- HDU - 7084 Pty loves string kmp + fail树 + 主席树
传送门 文章目录 题意: 思路: 题意: 给你一个字符串sss,有qqq个询问,每次给x,yx,yx,y代表取sss的前xxx个字符和后yyy个字符拼接起来得到ttt,输出ttt在sss中出现的次数. ...
最新文章
- vs2010快捷方式
- 32岁程序员,失业4个月45次面试经历,与君共勉
- JavaScript之Promise实现
- 总结C#保留小数位数
- Nacos 入门教程
- mysql压缩包修改密码_mysql 解压之后一堆文件,第一次安装 与 修改密码
- 学习16位DOS汇编笔记
- 清北学堂模拟赛d2t4 最大值(max)
- ubyntu 链接mysql_ubuntu mysql远程连接
- DAM的内涵正在改变
- 第一次注册苹果开发者账号
- CPP】【const 指针与引用】实验3实验内容5
- 喜报!签约招商证券,字根科技错别字检测再创佳绩
- 简易词典Android界面代码,Android 有道词典的简单实现方法介绍
- LevelDb(二):LevelDb整体架构
- ps怎么修改图片上的数字(适用于图片上已有的数字)
- 玩转console.log 如何在console.log里面插入图片
- 如何实现一个简短的注册邀请码
- python申明变量注意事项_python申明变量
- 单片机毕设 自动售货机设计与实现(源码+硬件+论文)
热门文章
- halcon ocr 生成样本变体_Halcon简单文字识别OCR的使用
- 直方图python高度_python – 子图中直方图的动画
- 未检测到正确安装的网络适配器_电脑网络适配器有感叹号怎么解决?
- 知乎高赞:看懂这个颠覆世界观的认知,远比做1000道题更有用!
- 牛顿新定律:凭本事得到的,凭什么要还?
- 为什么手机最后 10% 的电量很不耐,最后1%的电量最耐用?
- 开年趣图汇总:对不起,让你笑了这么久
- 机器学习都需要有哪些数学知识?
- Lanchester战争模型:用可分离变量的微分方程占卜战事
- nginx php oracle,第8天 ORACLE安装及NGINX整合PHP环境