Description

Input

第一行包含一个整数n(≤100000)。

第二行是长度为n的由0到9组成的字符串。

第三行是一个整数m。

接下来m≤5·10^4行,第i行是一个由0到9组成的字符串s,保证单行字符串长度小于等于10^5,所有字符串长度和小于等于3·10^6

Output

输出m行,第i行表示第si和S匹配所比较的次数。

建出后缀树,将询问按第一次匹配到的位置从小到大排序,离线处理,用树状数组维护后缀树的dfs序

从左到右加入后缀,加入时将后缀树上对应点+1,处理第一次匹配位置在这个后缀的询问

对每个询问串,在后缀树上匹配一次,查询经过的每个点的子树和

#include<bits/stdc++.h>
typedef long long i64;
const int N=2e5+;
int n,m;
char s1[N];
int nx[N][],ch[N][],l[N],fa[N],pv=,ptr=,lr[N][],in[N],q[N],ql,qr,id[N][],idp=;
int bit[N],bs[N],ws[N];
void inc(int w){
for(++bs[w];w<=idp;w+=w&-w)++bit[w];
}
bool _=;
int sum(int w){
if(_)return bs[w];
int s=;
for(;w;w-=w&-w)s+=bit[w];
return s;
}
void ins(int pos){
int x=s1[pos]-='';
int p=pv,np=++ptr;
l[np]=l[p]+;
while(p&&!nx[p][x])nx[p][x]=np,p=fa[p];
if(!p)fa[np]=;
else{
int q=nx[p][x];
if(l[q]==l[p]+)fa[np]=q;
else{
int nq=++ptr;
lr[nq][]=n+;
l[nq]=l[p]+;
memcpy(nx[nq],nx[q],sizeof(nx[]));
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
while(p&&nx[p][x]==q)nx[p][x]=nq,p=fa[p];
}
}
ws[pos]=np;
lr[np][]=n;
pv=np;
}
void dfs(int w){
id[w][]=++idp;
for(int i=;i<;++i)if(ch[w][i])dfs(ch[w][i]);
id[w][]=idp;
}
void mins(int&a,int b){if(a>b)a=b;}
i64 as[];
struct Q{
char*s;
int len,e,ID;
void match(){
int w=,p=;
for(int i=;i<len&&w;++i){
int x=s[i]-'';
if(p==lr[w][])p=lr[w=ch[w][x]][];
else if(s1[++p]!=x)w=;
}
e=w?p-len+:n+;
}
void cal(){
int w=,p=;
for(int i=;i<len&&w;++i){
int x=s[i]-'';
if(p==lr[w][])p=lr[w=ch[w][x]][];
else if(s1[++p]!=x)w=;
as[ID]+=sum(id[w][])-sum(id[w][]-);
}
as[ID]+=e>n?n:e-;
}
bool operator<(Q x)const{return e<x.e;}
}qs[];
char s2[],*sp2=s2;
int main(){
scanf("%d%s",&n,s1+);
for(int i=n;i;--i)ins(i);
for(int i=;i<=ptr;++i)++in[fa[i]];
for(int i=;i<=ptr;++i)if(!in[i])q[++qr]=i;
in[]=-;
while(ql!=qr){
int w=q[++ql],f=fa[w];
if(!--in[f])q[++qr]=f;
lr[w][]=lr[w][]-l[w]+l[f]+;
mins(lr[f][],lr[w][]-);
ch[f][s1[lr[w][]]]=w;
}
dfs();
scanf("%d",&m);
for(int i=;i<m;++i){
scanf("%s",sp2);
qs[i].s=sp2;
qs[i].len=strlen(sp2);
qs[i].match();
qs[i].ID=i;
sp2+=qs[i].len+;
}
std::sort(qs,qs+m);
int qp=;
for(int i=;i<=n;++i){
inc(id[ws[i]][]);
for(;qp<m&&qs[qp].e==i;++qp)qs[qp].cal();
}
_=;
for(int i=;i<=idp;++i)bs[i]+=bs[i-];
for(;qp<m;++qp)qs[qp].cal();
for(int i=;i<m;++i)printf("%lld\n",as[i]);
return ;
}

bzoj 3413: 匹配的更多相关文章

  1. BZOJ 3413 匹配 (后缀自动机+线段树合并)

    题目大意: 懒得概括了 神题,搞了2个半晚上,还认为自己的是对的...一直调不过,最后终于在jdr神犇的帮助下过了这道题 线段树合并该是这道题最好理解且最好写的做法了,貌似主席树也行?但线段树合并这个 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. BZOJ.2034.[2009国家集训队]最大收益(二分图匹配 贪心)

    题目链接 双倍经验:BZOJ.4276.[ONTAK2015]Bajtman i Okrągły Robin(然而是个权限题.区间略有不同) \(Description\) 有\(n\)个任务,完成一 ...

  4. bzoj 1854 游戏 二分图匹配 || 并查集

    题目链接 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的 ...

  5. BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)

    线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...

  6. 基因匹配(bzoj 1264)

    Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球上只有4种),而更奇怪的是,组成DNA序列的每一种碱 ...

  7. bzoj 3507: [Cqoi2014]通配符匹配

    Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可 ...

  8. BZOJ 1189 二分匹配 || 最大流

    1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1155  Solved: 420[Submi ...

  9. BZOJ 1059 & 二分图匹配

    题意: 判断一个黑白染色的棋盘能否通过交换行或列使对角线上都是黑色. SOL: 真是有点醉...这种问题要么很神要么很水...第一眼感觉很水但就是不造怎么做...想了10分钟怎么感觉就是判断个数够不够 ...

随机推荐

  1. L1-018 大笨钟

    微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉.不过由于笨钟自己作息也不是很规律,所以敲钟并不定时.一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那 ...

  2. C# 历史曲线控件 基于时间的曲线控件 可交互的高级曲线控件 HslControls曲线控件使用教程

    本篇博客主要对 HslControls 中的曲线控件做一个详细的教程说明,大家可以根据下面的教程开发出高质量的曲线控件 Prepare 先从nuget下载到组件,然后就可以使用组件里的各种组件信息了. ...

  3. SSH项目搭建(四)——Maven的pom.xml配置

    史上最全的maven的pom.xml文件详解: https://www.cnblogs.com/qq765065332/p/9238135.html 下面的节点有不理解是啥意思的可以到上面链接的文章里 ...

  4. Java中生产者与消费者模式

    生产者消费者模式 首先来了解什么是生产者消费者模式.该模式也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线 ...

  5. paho.mqtt.embedded-c MQTTPacket transport.c hacking

    /******************************************************************************* * paho.mqtt.embedde ...

  6. Linux Framebuffer save as picture

    /********************************************************************************* * Linux Framebuff ...

  7. 【计算机视觉】如何使用opencv自带工具训练人脸检测分类器

    前言 使用opencv自带的分类器效果并不是很好,由此想要训练自己的分类器,正好opencv有自带的工具进行训练.本文就对此进行展开. 步骤 1.查找工具文件: 2.准备样本数据: 3.训练分类器: ...

  8. 批量分割视频opencv

    前言 视频处理过程中,会用到对等长的视频进行处理,此时要对大视频进行分割. 实现步骤 1.批量读取视频集: 2.视频分割: 测试代码 1.批量读取视频集: /********************* ...

  9. BZOJ1369/BZOJ2865 【后缀数组+线段树】

    Description XX在进行字符串研究的时候,遇到了一个十分棘手的问题. 在这个问题中,给定一个字符串S,与一个整数K,定义S的子串T=S(i, j)是关于第K位的识别子串,满足以下两个条件: ...

  10. Codeforces Beta Round #81 A Transmigration

    在魔界战记中有一个设定叫做转生,当一个人物转生时,会保留之前的技能,但是技能等级需要乘以一个系数 k ,如果技能等级小于100,将会在转生之后失去该技能. 转生之后,会学到一些新技能.这些新技能附加的 ...