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分钟怎么感觉就是判断个数够不够 ...
随机推荐
- pl/sql快速输入select等语句
平时对数据库操作的时候,输入DML语句,很浪费时间,我们想要这样的效果 ,输入sf,plsql就会自动输入select * from.我们需要在plsql中进行如下设置即可: 工具(tools)--& ...
- HDU 4635 Strongly connected (Tarjan+一点数学分析)
Strongly connected Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- pyqt(一)安装及配置。
一:简介 PyQt实现了一个Python模块集.它有超过300类,将近6000个函数和方法.它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac. PyQt采用双 ...
- 软工作业No.4
2048小游戏—设计开发 软件需求规格说明书 甜美女孩 2018年10月 ——————————————————————————— 文档修改记录 日期 版本 说明 作者 2018-10-18 V1. ...
- 玩转X-CTR100 l STM32F4 l U-Blox NEO-6M GPS卫星定位-nmealib解码库移植解码
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 扩展GPS ...
- 怎样更新PE内的工具
准备工作:1. UltraISO - 下载:http://yunpan.cn/Q5XuHwG4ydv85 (访问密码:6263) 2. 7-zip - 下载:http://yunpan.c ...
- SWIFT中用Switch case 类类型
有时觉得SWIFT的语法真的强大而又变态,不说了,直接上代码瞅瞅: 首先先定义一个交通工具的父类 class Vehicle{ var wheels:Int! var speed:Double! in ...
- 特征工程 —— 特征重要性排序(Random Forest)
树模型天然会对特征进行重要性排序,以分裂数据集,构建分支: 1. 使用 Random Forest from sklearn.datasets import load_boston from skle ...
- CentOS7安装OpenStack(Rocky版)-07.安装horizon服务组件(控制节点dashboard)
在上一篇文章分享了neutron网络服务的安装配置,本文分享openstack的horizon(dashboard)web界面管理服务,方便在浏览器操作 ---------------------- ...
- 【c++基础】ifstream的构造函数
公共成员函数: ) ifstream(); initialization () explicit ifstream (const char* filename, ios_base::openmode ...