bzoj 3413: 匹配
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: 匹配的更多相关文章
- 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分钟怎么感觉就是判断个数够不够 ...
随机推荐
- DBGridEh 在粘贴中文时出现乱码和错位 100zhx_888]
http://www.fx114.net/qa-29-3439.aspx 回复于: -- :: unit DBGridEh; 把下面这个函数替换成这样 procedure TDBGridInplace ...
- JAVA第5次作业
将指定目录下的所有文件显示到列表框(JList)组件中,如下图所示: import java.awt.BorderLayout; import java.awt.Color; import java. ...
- 再谈Contacts中姓氏多音字排序错误问题
说到中国人的名字,那就不得不考虑多音字的问题,比如'单',在作为姓氏时应该读作'shan'而不是'dan'.但是在Contacts程序中却使用的是'D'来作为bucket label!这是为什么?如何 ...
- anu - event
import { document } from "./browser"; import { isFn, noop, options } from "./util&quo ...
- HackPwn:TCL智能洗衣机破解细节分析
上周结束的Hackpwn上,黑客们脑洞大开,破解了比亚迪汽车.小米手环.乐小宝.长虹电视.TCL洗衣机和九阳豆浆机等一系列最新的智能硬件,据黑客介绍,TCL是一家把家门“砌死”的企业,由于得到了将要被 ...
- IOS控件大全及控件大小
一 视图UIView和UIWindow iphone视图的规则是:一个窗口,多个视图.UIWindow相当于电视机,UIViews相当于演员. 1.显示数据的视图 下面几个类可在屏幕上显示信息: UI ...
- springboot跨域请求
首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 SpringBoot | 番外:使用小技巧合集 2018/09/17 | 分类: 基础技术 | 0 条评论 | 标 ...
- Excel 设置标题栏
1. 选中列表标题行, 可以设置字体居中显示,并放大字体以表示这是标题栏. 2. 选中列表第一数据行,即列表标题行下一行,选择View > Freeze Panes.
- 如何释放vector变量
std::vector<cv::Point> probp; std::vector<int> plabel; plabel.clear(); std::vector<in ...
- C#反射 字符串转为实体类,并做为参数传入泛型方法中使用
工作中有这样一个需求,有N张不同的报表,每张报表对应一个数据源,统计数据采用内存方式,首先在内在里定义了数据源对应实体.统计条件用lamdba表达式式实现,通过工具对单元格进行定义.在实现过程中针对每 ...