bzoj 3413: 匹配
Description
.jpg)
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: 匹配的更多相关文章
- BZOJ 3413 匹配 (后缀自动机+线段树合并)
题目大意: 懒得概括了 神题,搞了2个半晚上,还认为自己的是对的...一直调不过,最后终于在jdr神犇的帮助下过了这道题 线段树合并该是这道题最好理解且最好写的做法了,貌似主席树也行?但线段树合并这个 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ.2034.[2009国家集训队]最大收益(二分图匹配 贪心)
题目链接 双倍经验:BZOJ.4276.[ONTAK2015]Bajtman i Okrągły Robin(然而是个权限题.区间略有不同) \(Description\) 有\(n\)个任务,完成一 ...
- bzoj 1854 游戏 二分图匹配 || 并查集
题目链接 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的 ...
- BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)
线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...
- 基因匹配(bzoj 1264)
Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球上只有4种),而更奇怪的是,组成DNA序列的每一种碱 ...
- bzoj 3507: [Cqoi2014]通配符匹配
Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可 ...
- BZOJ 1189 二分匹配 || 最大流
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1155 Solved: 420[Submi ...
- BZOJ 1059 & 二分图匹配
题意: 判断一个黑白染色的棋盘能否通过交换行或列使对角线上都是黑色. SOL: 真是有点醉...这种问题要么很神要么很水...第一眼感觉很水但就是不造怎么做...想了10分钟怎么感觉就是判断个数够不够 ...
随机推荐
- (转)Secondary NameNode的作用
在Hadoop中,有一些命名不好的模块,Secondary NameNode是其中之一.从它的名字上看,它给人的感觉就像是NameNode的备份.但它实际上却不是.很多Hadoop的初学者都很疑惑,S ...
- 2.1 C++类的定义和声明
参考:http://www.weixueyuan.net/view/6333.html 总结: 类相当于一个新的数据类型,定义类对象时,除了能定义单个变量以外,用类定义一个数组或者指针都是可行的. 在 ...
- MyEclipse移动开发教程:设置所需配置的iOS应用(四)
MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] 三.创建配置文件 Provisioning profiles授权文件应用程序在iOS设备上安装并运 ...
- 【重大更新】DevExpress v17.2新版亮点—WPF篇(三)
DevExpress年终击穿底价,单套授权低至67折!仅剩最后10天!查看详情>>> 用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增 ...
- BadUSB测试记录
0x00 前言 不是很新的东西,其他作者已对此做过研究测试,本文仅用来记录操作过程,保存日志,说明细节. 0x01参考资料 https://github.com/adamcaudill/Psychso ...
- cobbler网络装机
cobbler网络装机 原理分析 cobbler简介 Cobbler通过将设置和管理一个安装服务器所涉及的任务集中在一起,从而简化了系统配置.相当于Cobbler封装了DHCP.TFTP.XINTED ...
- 使用pace监控ajax踩过的坑
使用vue.js开发移动端的活动页面时,有时候会出现因为请求的数据没有返回而使得当前活动页结构混乱或者不美观,这个时候可以考虑使用pace.js,通过设置参数值,在ajax全部请求结束之前显示load ...
- stm32 SPI介绍和配置
SPI是一种高速的,全双工同步的通信总线,在芯片管脚上占用了四根线,节约了芯片的管脚,同时为PCB的布局节省了空间,提供了方便,因此越来越多的芯片集成了这种通信协议,STM32也就有了SPI接口. 有 ...
- [LeetCode&Python] Problem 868. Binary Gap
Given a positive integer N, find and return the longest distance between two consecutive 1's in the ...
- dos命令批处理发送文字到剪贴板
方法一(推荐): echo 要发送到剪贴板的字 | clip 方法二: @echo off::显示要发送的文字重定向到windows临时文件夹下echo 要发送到剪贴板的字>%system ...