博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Coci2015]Divljak
阅读量:4679 次
发布时间:2019-06-09

本文共 1862 字,大约阅读时间需要 6 分钟。

 题目描述 

Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的。
接下来会发生q个操作,操作有两种形式:
“1 P”,Bob往自己的集合里添加了一个字符串P。
“2 x”,Alice询问Bob,集合T中有多少个字符串包含串S_x。(我们称串A包含串B,当且仅当B是A的子串)
Bob遇到了困难,需要你的帮助。
题解
多串匹配问题,可以想到用AC自动机维护。
对于这种询问,每个串至多贡献一次的问题。
先是把每个T串在AC自动机上跑一遍,获得了一个点集,那么这些点在fail树上到根的路径上的所有点都会被贡献一次。
相当于这些链的并都被贡献了。
那我们的任务就是求链并。
一种方法是将所有点排一个序,然后对每个点到根的路径上加1,相邻两个点的LCA处-1。
链加不太好写,可以转化成统计子树和的形式,用BIT维护。
代码
#include
#include
#include
#include
#include
#define N 2000002using namespace std;typedef long long ll;queue
q;int tot,ch[N][26],head[N],f[N],zh[N],topp,n,tr[N],tag[N],size[N],deep[N],fa[N],son[N],top[N],dfn[N],dfnn,tott,fan[N];char s[N];inline ll rd(){ ll x=0;char c=getchar();bool f=0; while(!isdigit(c)){ if(c=='-')f=1;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return f?-x:x;}struct edge{ int n,to;}e[N];inline void add(int u,int v){e[++tot].n=head[u];e[tot].to=v;head[u]=tot;}inline void get_fail(){ for(int i=0;i<26;++i)if(ch[0][i]){q.push(ch[0][i]),add(0,ch[0][i]);} while(!q.empty()){ int u=q.front();q.pop(); for(int i=0;i<26;++i){; if(ch[u][i])f[ch[u][i]]=ch[f[u]][i],add(f[ch[u][i]],ch[u][i]),q.push(ch[u][i]); else ch[u][i]=ch[f[u]][i]; } }}inline void upd(int x,int y){ while(x<=dfnn)tr[x]+=y,x+=x&-x;}inline int query(int x){ int ans=0;while(x)ans+=tr[x],x-=x&-x;return ans;}inline void ins(int id){ int len=strlen(s);int now=0; for(int i=0;i
size[son[u]]||!son[u])son[u]=v; }}void dfs2(int u){ if(!top[u])top[u]=u;dfn[u]=++dfnn;fan[dfnn]=u; if(son[u])top[son[u]]=top[u],dfs2(son[u]); for(int i=head[u];i;i=e[i].n){ int v=e[i].to; if(v!=son[u])dfs2(v); }}int getlca(int u,int v){ while(top[u]!=top[v]){ if(deep[top[u]]

转载于:https://www.cnblogs.com/ZH-comld/p/10371731.html

你可能感兴趣的文章
jquery 动画总结(主要指效果函数)
查看>>
leetcode-17-电话号码的字母组合’
查看>>
Flume 示例
查看>>
Designing for Performance
查看>>
HTML属性的应用
查看>>
HEAP CORRUPTION DETECTED
查看>>
Android URI简单介绍
查看>>
蒙板 模态对话框
查看>>
pythong中的全局变量的调用和嵌套函数中变量的使用
查看>>
【POJ - 3009】Curling 2.0 (dfs+回溯)
查看>>
Windows下载安装良心教程
查看>>
浅析商业银行“业务连续性管理体系”的构建
查看>>
【分享】从《水浒传》中反思什么是真正的执行力
查看>>
java中的static
查看>>
5.侧边栏逻辑
查看>>
评论博客
查看>>
用户代理字符串识别工具源码与slf4j日志使用
查看>>
算法导论第6部分图算法,第22章图的基本算法
查看>>
提示框第三方库之MBProgressHUD
查看>>
C语言 10-字符和字符串常用处理函数
查看>>