【bzoj3881】【Coci2015】Divljak

题解
- 对$S$集合ac建自动机,把$T_{i}$放在里面跑,记录路径上的所有节点并对它们在fail树上求到root的树链并;
- 这样就得到了$T_{i}$所有的子串;
- 动态将$T_{i}$加入直接用树状数组维护子树和即可;
- 另见:喵星球上的点名的ac自动机解法
#include<bits/stdc++.h>
#define rg register
#define il inline
using namespace std;
const int N=;
int n,m,cnt,ch[N][],fl[N],fa[N],head,tail,que[N],o=,hd[N],sz[N];
int tp[N],dep[N],idx,st[N],ed[N],c[N],vis[N],id[N],tmp[N],tot,tt;
char s[N];
struct Edge{int v,nt;}E[N];
il void adde(int u,int v){E[o]=(Edge){v,hd[u]};hd[u]=o++;}
il char gc(){
static char*p1,*p2,S[];
if(p1==p2)p2=(p1=S)+fread(S,,,stdin);
return(p1==p2)?EOF:*p1++;
}
il int rd(){
int x=; char C=gc();
while(C<''||C>'')C=gc();
while(C>=''&&C<='')x=(x<<)+(x<<)+C-'',C=gc();
return x;
}
il int gt(){
char *p=s,C=gc();
while(!isalpha(C))C=gc();
while(isalpha(C))*p++=C,C=gc();
return p - s;
}
il bool cmp(const int&a,const int&b){return st[a]<st[b];}
il void ins(int now,int len){
int u=,x;
for(int i=;i<len;i++){
if(!ch[u][x=s[i]-'a'])ch[u][x]=++cnt;
u=ch[u][x];
}
sz[id[now]=u]=vis[u]=;
}
void get_fl(){
head=tail=;
for(rg int i=;i<;i++)if(ch[][i]){
que[++tail]=ch[][i];
if(vis[ch[][i]])adde(,ch[][i]);
}
while(head<tail){
int u=que[++head];
for(rg int i=;i<;i++){
int&v=ch[u][i];
if(!v){v=ch[fl[u]][i];continue;}
fl[v]=ch[fl[u]][i];
if(vis[fl[v]])fa[v]=fl[v];
else fa[v]=fa[fl[v]];
if(vis[v])adde(fa[v],v);
que[++tail]=v;
}
}
for(int i=tail;i;i--)if(vis[que[i]])sz[fa[que[i]]]+=sz[que[i]];
}
il void dfs(int u,int T){
st[u]=++idx;tp[u]=T;
dep[u]=dep[fa[u]]+;
int mx=-,son=;
for(rg int i=hd[u];i;i=E[i].nt){if(sz[E[i].v]>mx)mx=sz[son=E[i].v];}
if(son)dfs(son,T);
for(rg int i=hd[u];i;i=E[i].nt){if(E[i].v!=son)dfs(E[i].v,E[i].v);}
ed[u]=idx;
}
il void add(int x,int y){if(!x)return;for(;x<=idx;x+=x&-x)c[x]+=y;}
il int ask(int x){int re=;for(;x;x-=x&-x)re+=c[x];return re;}
il int lca(int u,int v){
int tu=tp[u],tv=tp[v];
while(tu!=tv){
if(dep[tu]<dep[tv])v=fa[tv],tv=tp[v];
else u=fa[tu],tu=tp[u];
}
return dep[u]<dep[v]?u:v;
}
void update(int len){
tt=tot=;
for(rg int i=,u=;i<len;i++){
u=ch[u][s[i]-'a'];
if(vis[u])tmp[++tt]=u;
else if(fa[u])tmp[++tt]=fa[u];
}
if(!tt)return;
sort(tmp+,tmp+tt+,cmp);
tot=;
for(rg int i=;i<=tt;i++){
tot+=st[tmp[i]]>ed[tmp[tot]];
tmp[tot]=tmp[i];
}
add(st[tmp[]],);
for(rg int i=;i<=tot;i++){
add(st[lca(tmp[i],tmp[i-])],-);
add(st[tmp[i]],);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("bzoj3881.in","r",stdin);
freopen("bzoj3881.out","w",stdout);
#endif
n=rd();
for(rg int i=;i<=n;i++){ins(i,gt());}
get_fl();
dfs(,);
m=rd();
for(rg int i=,x,y;i<=m;i++){
x=rd();
if(x==)update(gt());
else y=rd(),printf("%d\n",ask(ed[id[y]])-ask(st[id[y]]-));
}
return ;
}bzoj3881
【bzoj3881】【Coci2015】Divljak的更多相关文章
- 【BZOJ3881】[Coci2015]Divljak fail树+树链的并
[BZOJ3881][Coci2015]Divljak Description Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【疯狂造轮子-iOS】JSON转Model系列之一
[疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(上)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- 【Win 10 应用开发】应用预启动
所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】
由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...
- 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包
微信支付教程系列之现金红包 最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付
微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...
随机推荐
- Hyperledger Fabric CA User’s Guide——开始(三)
Fabric CA User’s Guide——开始 先决条件 安装Go 1.9+ 设置正确的GOPATH环境变量 安装了libtool和libtdhl-dev包 下面是在Ubuntu上安装libto ...
- Swagger本地环境配置
一.技术背景 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.先后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远.而前后端的唯一联系便是 API 接口,与此同 ...
- Spring Boot + MyBatis + Pagehelper 配置多数据源
前言: 本文为springboot结合mybatis配置多数据源,在项目当中很多情况是使用主从数据源来读写分离,还有就是操作多库,本文介绍如何一个项目同时使用2个数据源. 也希望大家带着思考去学习!博 ...
- lscpu命令详解
基础命令学习目录首页 一.lscpu输出 使用lscpu查看的结果如下图,这里会显示很多信息,如下: 使用lscpu -p会详细的numa信息,如下: [root@localhost ~]# lscp ...
- CSS命名规范(规则)常用的CSS命名规则
CSS命名规范(规则)常用的CSS命名规则 CSS命名规范(规则)常用的CSS命名规则 头:header 内容:content/container 尾:footer ...
- jsp九大内置对象之二response
这里主要写response向浏览器输出数据时的编码,输出数据有两种: response.getOutStram().write("讲讲".getBytes("utf-8& ...
- <构建之法>阅读感想
在阅读<构建之法>之前,我所认为的软件就是通过c,c++等语言编程,制作出的一个能满足人们操作需求的一些代码,认为一个好的软件工程师,就是能够在很短的时间之内,最快的根据需求写出几段代码程 ...
- b5
吴晓晖(组长) 过去两天完成了哪些任务 完善推荐算法 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员:刘帅珍 过去两天完成了哪些任务: 修改原型,整理背景 明日计 ...
- 使用成员资格管理用户Membership
ASP.NET成员资格使您可以验证和管理Web应用程序的用户信息.它提供验证用户凭据,创建和修改成员资格用户以及管理用户设置(如密码和电子邮件地址)的功能. ASP.NET成员资格主要用于ASP.NE ...
- Excelutil 工具类
1.说明:ExcelUtil主要用于获得单元格的数据和对对指定单元格中写入数据用! 相关代码如下: package main.java; import java.io.File; import jav ...