Description

给出串 \(S\) ,和 \(m\) 个串 \(T_i\) ,每次询问 \((l,r,pl,pr)\) 表示 \(S[pl...pr]\) 在 \(T[l...r]\) 中哪一个出现次数最多,求出现次数和编号
题面

Solution

基础题...
对于 \(S,T[l...r]\) 放在一起建广义后缀自动机
然后每次倍增到 S[pl,pr] ,然后查询子树内出现次数最多的 \(T\) 即可
我们可以开一棵 \([1,m]\) 的线段树,维护每一个 \(T\) 的出现次数,维护最大值和最大值位置
线段树合并上来就好了

#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){int f;char c;for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=1100010;
int n,m,Q,ch[N][26],cur=1,cnt=1,len[N],fa[N],pos[N],rt[N];char s[N];
int head[N],nxt[N],to[N],num=0,pa[N][20],tt=0,ls[N*20],rs[N*20];
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
inline void ins(int c){int p=cur;cur=++cnt;len[cur]=len[p]+1;for(;p && !ch[p][c];p=fa[p])ch[p][c]=cur;if(!p)fa[cur]=1;else{int q=ch[p][c];if(len[p]+1==len[q])fa[cur]=q;else{int nt=++cnt;len[nt]=len[p]+1;memcpy(ch[nt],ch[q],sizeof(ch[nt]));fa[nt]=fa[q];fa[cur]=fa[q]=nt;for(;p && ch[p][c]==q;p=fa[p])ch[p][c]=nt;}}
}
struct data{int w,p;}tr[N*20];
inline data upd(data x,data y){if(x.w>=y.w)return x;return y;
}
inline int merge(int x,int y){if(!x||!y)return x+y;int o=++tt;if(!ls[x] && !rs[x]){tr[o].w=tr[x].w+tr[y].w;tr[o].p=tr[x].p;return o;}ls[o]=merge(ls[x],ls[y]);rs[o]=merge(rs[x],rs[y]);tr[o]=upd(tr[ls[o]],tr[rs[o]]);return o;
}
inline void mdf(int &x,int l,int r,int sa){if(!x)x=++tt;if(l==r){tr[x].w++;tr[x].p=l;return ;}int mid=(l+r)>>1;if(sa<=mid)mdf(ls[x],l,mid,sa);else mdf(rs[x],mid+1,r,sa);tr[x]=upd(tr[ls[x]],tr[rs[x]]);
}
inline void dfs(int x){for(int i=1;i<=19;i++)pa[x][i]=pa[pa[x][i-1]][i-1];for(int i=head[x];i;i=nxt[i])dfs(to[i]),rt[x]=merge(rt[x],rt[to[i]]);
}
inline int lca(int x,int k){for(int i=19;i>=0;i--)if(len[pa[x][i]]>=k)x=pa[x][i];return x;
}
inline data qry(int x,int l,int r,int sa,int se){if(sa<=l && r<=se)return tr[x];int mid=(l+r)>>1;if(se<=mid)return qry(ls[x],l,mid,sa,se);if(sa>mid)return qry(rs[x],mid+1,r,sa,se);return upd(qry(ls[x],l,mid,sa,mid),qry(rs[x],mid+1,r,mid+1,se));
}
int main(){freopen("pp.in","r",stdin);freopen("pp.out","w",stdout);scanf("%s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++)ins(s[i]-'a'),pos[i]=cur;cin>>m;for(int i=1;i<=m;i++){scanf("%s",s+1);cur=1;for(int j=1,len=strlen(s+1);j<=len;j++)ins(s[j]-'a'),mdf(rt[cur],1,m,i);}for(int i=2;i<=cnt;i++)link(fa[i],i),pa[i][0]=fa[i];dfs(1);int x,y,l,r;cin>>Q;while(Q--){gi(l);gi(r);gi(x);gi(y);x=lca(pos[y],y-x+1);data t=qry(rt[x],1,m,l,r);if(t.w)printf("%d %d\n",t.p,t.w);else printf("%d 0\n",l);}return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/9098887.html

Codeforces 666E. Forensic Examination相关推荐

  1. Codeforces.666E.Forensic Examination(广义后缀自动机 线段树合并)

    题目链接 \(Description\) 给定串\(S\)和\(m\)个串\(T_i\).\(Q\)次询问,每次询问\(l,r,p_l,p_r\),求\(S[p_l\sim p_r]\)在\(T_l\ ...

  2. Codeforces 666E Forensic Examination

    题意:给定主串s和m个模式串,每次询问[l,r]的模式串中出现s[pl...pr]次数最多的串和次数. 这题挺简单的,先把所有模式串拿来建广义后缀自动机,询问相当于子树众数,用线段树合并即可. 那我为 ...

  3. Codeforces 666E Forensic Examination SAM+权值线段树

    第一次做这种\(SAM\)带权值线段树合并的题 然而\(zjq\)神犇看完题一顿狂码就做出来了 \(Orz\) 首先把所有串当成一个串建\(SAM\) 我们对\(SAM\)上每个点 建一棵权值线段树 ...

  4. 【CF666E】Forensic Examination - 广义后缀自动机+线段树合并

    广义SAM专题的最后一题了--呼 题意: 给出一个长度为$n$的串$S$和$m$个串$T_{1\cdots m}$,给出$q$个询问$l,r,pl,pr$,询问$S[pl\cdots pr]$在$T_ ...

  5. zabbix监控oracle缓冲区,Zabbix监控oracle各服务器连接数

    需求: 根据机器名查询oracle连接数,并通过zabbix进行监控 脚本: [root@rac1 Zabbix_S]# cat get_conns.py #!/usr/bin/python #cod ...

  6. 2020.6月做题记录

    长期计划 SAM专题 date:2020.05.21-2020.06.01 基础类: Problem Finished P3804 [模板]后缀自动机 (SAM) √√√ SP1811 LCS - L ...

  7. tmp ubuntu 自动删除吗_ubuntu 自动清理/tmp目录

    在Ubuntu系统中,在/tmp文件夹里面的内容,每次开机都会被清空,如果不想让他自动清理的话,只需要更改rcS文件中的TMPTIME的值. 我们看如何来修改 sudo vi /etc/default ...

  8. [NOI2018]你的名字

    SAM写的太不熟练了~~SAM上的线段树合并也不熟练~~~ 调了半天样例 题目大意: 给定一个S,Q次询问,每次给出T,l,r, 求对于S[l,r],属于T的子串却不属于S[l,r]的子串有多少个 看 ...

  9. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

最新文章

  1. ant Table td 溢出隐藏(省略号)
  2. 深入浅出解释FFT(六)——深入理解fft变换
  3. Java基础-内部类
  4. wxWidgets:wxDataInputStream类用法
  5. 信息学奥赛一本通 1233:接水问题 | 1950:【10NOIP普及组】接水问题 | OpenJudge NOI 1.9 15 | 洛谷 P1190 [NOIP2010 普及组] 接水问题
  6. java动态修改class_Java Agent入门学习之动态修改代码
  7. 半年全球网络安全入侵事件近千起,超19亿数据受影响
  8. JAVA创建对象有哪几种方式
  9. 推荐15款免费的网页抓取软件
  10. 电脑浏览器打不开html文档,电脑浏览器打不开本地html文件
  11. 设计一个几何图形的面积计算器,希望这个计算器可以计算圆和矩形等图形的面积
  12. ICX285 ICX205 ICX414 3CCD共用驱动板电路设计
  13. MyBatisCodeHelper-Pro2.8.2
  14. 【舍友计划】恶搞~让计算机变卡变慢
  15. spring 注解练习
  16. 特斯拉与费拉里斯究竟是如何发明多相电机的呢?
  17. redis基础教程 --发布与订阅
  18. sql查询语句-平均分、最高最低分、判断、排序
  19. 虚拟机linux删除多余于的启动,清除Linux系统多余引导选项
  20. 从0到1搭建电商营销数据分析平台(五)——流批一体架构

热门文章

  1. iphone固件降级_我在iPhone上装了个安卓
  2. 报任安书文言现象_语文老师精心总结【文言文常考点】够你从初一用到初四!...
  3. 服务总线yali测试_服务器的压力测试方法与流程
  4. C语言打印输出红色字体
  5. C语言笔试两题,有坑
  6. 弱口令扫描工具mysql ftp_基于端口的弱口令检测工具--iscan
  7. 删除一个程序Linux,一天一个Linux基础命令删除文件或目录命令rm
  8. css 竖行进度图_前端学习--汇集了大量 CSS 的使用和学习的示例代码
  9. sping jdbc 链接mysql_Spring Boot JDBC 连接数据库示例
  10. [渝粤教育] 武汉大学 数字图像处理 参考 资料