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. 51nod1537

    题解: 预处理每一个要变换几次,然后改成每一个要改变的次数-上一个要改变的次数 然后对于区间[l,r]修改,就是l++,r+1++ dp即可(据说可以o(n)) 代码: #include<bit ...

  2. DBGridEh 在粘贴中文时出现乱码和错位 100zhx_888]

    http://www.fx114.net/qa-29-3439.aspx 回复于: -- :: unit DBGridEh; 把下面这个函数替换成这样 procedure TDBGridInplace ...

  3. Spring MVC和Spring Data JPA之按条件查询和分页(kkpaper分页组件)

    推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有, 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 ...

  4. Kafka生产者APi

    kafka客户端发布record(消息)到kafka集群. 新的生产者是线程安全的,在线程之间共享单个生产者实例,通常单例比多个实例要快. 一个简单的例子,使用producer发送一个有序的key/v ...

  5. HTML项目总结

    一些存在的可以改进的地方: 达到一个效果不必要墨守成规,比如:

  6. 201621123010《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...

  7. Java性能优化之JVM GC(垃圾回收机制)

    Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.st ...

  8. OK335xS U-boot 编译问题&无Linux shell 问题

    /************************************************************************** * OK335xS U-boot 编译问题&am ...

  9. 【c++基础】判断是否到文件末尾-eof函数

    前言 读取文件内容时,需要判断是否到文件末尾,此时用到eof函数. 函数定义 Check whether eofbit is set Returns true if theeofbiterror st ...

  10. [LeetCode&Python] Problem 693. Binary Number with Alternating Bits

    Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits will a ...