Codeforces 666E. Forensic Examination

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab控制精度

控制精度matlab控制运算精度用的是digits和vpa这两个函数digits用于规定运算精度&#xff0c;比如&#xff1a;digits(20);这个语句就规定了运算精度是20位有效数字。但并不是规定了就可以使用&#xff0c;因为实际编程中&#xff0c;我们可能有些运算需要控制精度&#xff0c;…

虚拟机环境下DPDK运行时的一些错误解决

在绑定网卡到DPDK模块时 报错 &#xff1a;is active. Not modifyingRouting table indicates that interface 0000:02:01.0 is active. Not modifying 解决方法&#xff1a; ifconfig <网卡名称> down 运行testpmd时无法分配内存&#xff1a;EAL: Error - exiting with …

ACM 网址和一些建议

USACO http://ace.delos.com/usacogate 美国著名在线题库&#xff0c;专门为信息学竞赛选手准备 TJU http://acm.tongji.edu.cn/ 同济大学在线题库&#xff0c;唯一的中文题库&#xff0c;适合NOIP选手 ZJU http://acm.zju.edu.cn/ 浙江大学在线题库 JLU http://acm.jlu…

使用Boxfuse轻松在云中运行Spring Boot应用程序

几天前&#xff0c;我开始构建一个将使用REST API检索和存储数据的iOS应用。 该REST API将是我也必须构建的服务器应用程序。 由于我熟悉Java和Spring &#xff0c;因此决定使用Spring Boot作为框架。 为了能够在我的iPhone上使用它&#xff0c;如果我可以在服务器而不是我自己…

Matlab各种求和

%普通求和sum(x);sum(x,1);sum(x,2); %累加求和cumsum(x);cumsum(x,1);cumsun(x,2); %累加求和的结果可以用diff实现逆运算

JavaScript内置对象Date----格式化时间

格式化时间日期: function getDate(dt) { //获取年份 var year dt.getFullYear(); //获取月份 var month dt.getMonth(); //获取日 var day dt.getDate(); //获取小时 var hour dt.getHours(); //获取分钟 var minute dt.getMinutes(); …

Matlab求欧式距离

pdist(x,‘euclidean’)1. %该函数还可以求其他距离&#xff0c;详见help2. %该函数得到的是一个向量&#xff0c;可以用squareform(Y)函数转换为对称矩阵形式。

川流不息

网站收藏&#xff1a; 1、站长网 网页教程与代码 2、博客制作 3、Java实例编程 贪吃蛇游戏开发视频教程

dao层通用封装_DAO层–救援通用

dao层通用封装泛型可以是使用编译时验证&#xff08;类型安全性&#xff09;的功能来创建可重用代码的强大工具。 不幸的是&#xff0c;我感到主流开发人员仍然对此感到恐惧。 但是&#xff0c;比喻海格的蜘蛛&#xff0c;我会说&#xff0c;泛型是被严重误解的生物……:-) 我…

(转) Linux 内核运行参数修改——sysctl命令

原文&#xff1a;https://blog.csdn.net/u012707739/article/details/78254241 sysctl命令被用于在内核运行时动态地修改内核的运行参数&#xff0c;可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项&#xff0c;用sysctl可以读取设置超过五百个…

Matlab求平均值函数mean

amean(A,1) %按列平均bmean(A,2) %按行平均cmean(A(:)) %全部平均

HDU 4514 湫湫系列故事——设计风景线

一次dfs判断有没有环 两次dfs求最长路 第一次记录最长路和次长路 第二次求出答案 #include <iostream>#include <string>#include <cstring>#include <algorithm>#include <cstdio>#define maxn 100010#pragma comment(linker, "/STACK:367…

numpy的使用数组的创建2

随机创建了长度为十的数组 获得十以类的随机整数 快速获取数组2乘3维的数组 生成20个1到10之间的数组 通过reshape 将这些数变成二位数组 shape这个方法可以查看数组中的元素是几行几列的 转载于:https://www.cnblogs.com/chenligeng/p/9315339.html

Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java

流行的Java代码样式中最有趣的亮点是什么&#xff1f; 尽管上面有暗示性的形象&#xff0c;我们也不想发动任何不必要的圣战。 当归结为编码样式时&#xff0c;大多数选择都是相当随意的&#xff0c;并取决于个人喜好。 是的&#xff0c;即使在编辑器之间制表符宽度改变了&…

Matlab数据标准化

zscore%据说就是原数据减去均值再除以标准差标准回归系数&#xff1a;1、标准化回归系数测度的是对被解释变量的重要性&#xff0c;只有标准化了&#xff0c;才能进行重要性对比。

matlab学习-线性规划

[x,fval,exitflag,output,lambda]linprog(f,a,b,aeq,beq,lb,ub) 其中f、x、b、beq、lb、ub为向量&#xff0c;a、aeq为矩阵。 min zf s.t. a*x<b aeq*xbeq lb<x<ub x:线性规划最优解 fval&#xff1a;线性规划最优值 exitflag&#xff1a;输出标…

bug单的提交

顶头信息 所属产品&#xff0c;所属项目&#xff0c;所属模块&#xff0c;影响版本&#xff0c;当前指派&#xff0c;bug类型&#xff1a;代码错误&#xff0c;界面优化&#xff0c;设计缺陷&#xff0c;性能问题&#xff0c;标准规范&#xff0c;其他&#xff0c;安全相关。bu…

Matlab各种随机数汇总

randn();%正态分布随机数R&#xff1d;normrnd(MU,SIGMA)R&#xff1d;normrnd(MU,SIGMA,m)R&#xff1d;normrnd(MU,SIGMA,m,n) 注&#xff1a;正态分布只需要2个参数。 randn() 是标准正态分布&#xff1b;normrnd()是自己可以指定均数和标准差的正太分布。rand();randi();是…

ES group分组聚合的坑

参考链接&#xff1a;https://blog.csdn.net/u010454030/article/details/71762838 ES group分组聚合的坑 原来知道Elasticsearch在分组聚合时有一些坑但没有细究&#xff0c;今天又看了遍顺便做个笔记和大家分享一下。 我们都知道Elasticsearch是一个分布式的搜索引擎&#xf…

使用tinylog 1.1改进您在Java EE应用程序中的登录

tinylog是Java的轻量级日志记录框架。 与Apache Log4j和Logback相反&#xff0c;tinylog由仅80KB的单个JAR文件组成&#xff0c;没有任何依赖性&#xff0c;并且具有静态logger类。 这意味着您无需使用任何样板代码为每个类创建记录器实例。 public static void main(String[]…