传送门

文章目录

  • 题意:
  • 思路:

题意:

给你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 字典树 + 主席树相关推荐

  1. 线段树简单入门 (含普通线段树, zkw线段树, 主席树)

    线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...

  2. HDU 5919 Sequence II 主席树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5919 Sequence II Time Limit: 9000/4500 MS (Java/Othe ...

  3. HDU - 5919 Sequence II——主席树+区间种类++逆序建树

    [题目描述] HDU - 5919 Sequence II [题目分析] 题目给定一个数组,每次查询一个区间,找出区间内不同数字的个数x,然后输出按出现顺序第x/2向上取整个数字的位置. 按照要求,我 ...

  4. HDU - 4348To the moon——主席树+区间修改

    HDU - 4348To the moon [题目描述] [题目分析] 题目中说明每次更新后时间都会加1,而且还会需要查询以前的区间,还会需要返回以前的时间,所以是很裸的主席树.区间查询的话我们同样需 ...

  5. HDU - 4417 Super Mario(主席树/线段树+离线)

    题目链接:点击查看 题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个 题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用 ...

  6. HDU - 5919 Sequence II(主席树+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,再给出 m 次询问,每次询问给出一个区间 [ l , r ] ,问区间 [ l , r ] 内首次出现的数字的位置的中位数 题目分析:题 ...

  7. HDU - 5788 Level Up(主席树+dfs序+树状数组)

    题目链接:点击查看 题目大意:给出一棵有向树,每个节点都有一个初始的权值 a[ i ] ,和一个通过计算得到的权值 mid[ i ] ,mid 数组的计算方法如下:mid[ u ] 为结点 u 及其子 ...

  8. HDU 6703 array(主席树 + set)

    array 给一个全排列,接下来有两种操作: 一.把pospospos位置上的值+10,000,000+10,000,000+10,000,000. 二.查询[1,r][1, r][1,r]区间,没有 ...

  9. HDU - 7084 Pty loves string kmp + fail树 + 主席树

    传送门 文章目录 题意: 思路: 题意: 给你一个字符串sss,有qqq个询问,每次给x,yx,yx,y代表取sss的前xxx个字符和后yyy个字符拼接起来得到ttt,输出ttt在sss中出现的次数. ...

最新文章

  1. vs2010快捷方式
  2. 32岁程序员,失业4个月45次面试经历,与君共勉
  3. JavaScript之Promise实现
  4. 总结C#保留小数位数
  5. Nacos 入门教程
  6. mysql压缩包修改密码_mysql 解压之后一堆文件,第一次安装 与 修改密码
  7. 学习16位DOS汇编笔记
  8. 清北学堂模拟赛d2t4 最大值(max)
  9. ubyntu 链接mysql_ubuntu mysql远程连接
  10. DAM的内涵正在改变
  11. 第一次注册苹果开发者账号
  12. CPP】【const 指针与引用】实验3实验内容5
  13. 喜报!签约招商证券,字根科技错别字检测再创佳绩
  14. 简易词典Android界面代码,Android 有道词典的简单实现方法介绍
  15. LevelDb(二):LevelDb整体架构
  16. ps怎么修改图片上的数字(适用于图片上已有的数字)
  17. 玩转console.log 如何在console.log里面插入图片
  18. 如何实现一个简短的注册邀请码
  19. python申明变量注意事项_python申明变量
  20. 单片机毕设 自动售货机设计与实现(源码+硬件+论文)

热门文章

  1. halcon ocr 生成样本变体_Halcon简单文字识别OCR的使用
  2. 直方图python高度_python – 子图中直方图的动画
  3. 未检测到正确安装的网络适配器_电脑网络适配器有感叹号怎么解决?
  4. 知乎高赞:看懂这个颠覆世界观的认知,远比做1000道题更有用!
  5. 牛顿新定律:凭本事得到的,凭什么要还?
  6. 为什么手机最后 10% 的电量很不耐,最后1%的电量最耐用?
  7. 开年趣图汇总:对不起,让你笑了这么久
  8. 机器学习都需要有哪些数学知识?
  9. Lanchester战争模型:用可分离变量的微分方程占卜战事
  10. nginx php oracle,第8天 ORACLE安装及NGINX整合PHP环境