题目大意:

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遇到了困难,需要你的帮助。
题解:
建出fail树然后搞树链的并……
(恶心)
正经的题解开始。
先建出关于S的trie树,把fail树建出来。
然后每读进来一个T,就把它放在trie树上走一边,然后把经过的点记录下来。
按dfs入栈序排序。
然后在dfs序上将每个点入栈时间打+1标记,将相邻点的lca打-1标记
查询时直接tout-tin即可。
代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100050
#define M 2000050
int n,q,tot,tl[N];
char ch[M];
struct Trie
{int ch[28],fl;
}tr[M];
int hed[M],cnt;
struct EG
{int to,nxt;
}e[M];
void ae(int f,int t)
{e[++cnt].to = t;e[cnt].nxt = hed[f];hed[f] = cnt;
}
void trie_pic()
{queue<int>q;for(int i=1;i<=26;i++)if(tr[0].ch[i]){q.push(tr[0].ch[i]);ae(0,tr[0].ch[i]);}while(!q.empty()){int u = q.front();q.pop();for(int i=1;i<=26;i++){int &v = tr[u].ch[i];if(!v){v = tr[tr[u].fl].ch[i];continue;}tr[v].fl = tr[tr[u].fl].ch[i];ae(tr[v].fl,v);q.push(v);}}
}
int tin[M],tout[M],tim,fa[M],son[M],siz[M],dep[M],top[M];
void dfs(int u)
{tin[u]=++tim;siz[u]=1;for(int j=hed[u];j;j=e[j].nxt){int to = e[j].to;fa[to]=u;dep[to]=dep[u]+1;dfs(to);siz[u]+=siz[to];if(siz[to]>siz[son[u]]||!son[u])son[u]=to;}tout[u]=tim;
}
void dfs2(int u,int Top)
{top[u]=Top;if(!son[u])return ;dfs2(son[u],Top);for(int j=hed[u];j;j=e[j].nxt){int to = e[j].to;if(to!=son[u])dfs2(to,to);}
}
int get_lca(int x,int y)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);x=fa[top[x]];}return dep[x]<dep[y]?x:y;
}
int f[M];
void up(int x,int d)
{if(!x)return ;while(x<=2000000)f[x]+=d,x+=(x&(-x));
}
int down(int x)
{if(!x)return 0;int ret = 0;while(x)ret+=f[x],x-=(x&(-x));return ret;
}
int sta[M],tal;
bool cmp(int x,int y)
{return tin[x]<tin[y];
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",ch+1);int len = strlen(ch+1),u=0;for(int j=1;j<=len;j++){int c = ch[j]-'a'+1;if(!tr[u].ch[c])tr[u].ch[c]=++tot;u=tr[u].ch[c];}tl[i]=u;}trie_pic();dfs(0);dfs2(0,0);scanf("%d",&q);for(int opt,x,i=1;i<=q;i++){scanf("%d",&opt);if(opt==1){scanf("%s",ch+1);tal=0;int len = strlen(ch+1),u=0;for(int j=1;j<=len;j++){u = tr[u].ch[ch[j]-'a'+1];sta[++tal]=u;}sort(sta+1,sta+1+tal,cmp);for(int i=1;i<=tal;i++)up(tin[sta[i]],1);for(int i=1;i<tal;i++)up(tin[get_lca(sta[i],sta[i+1])],-1);}else{scanf("%d",&x);printf("%d\n",down(tout[tl[x]])-down(tin[tl[x]]-1));}}return 0;
}

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10017401.html

[Coci2015]Divljak相关推荐

  1. bzoj 3881 [Coci2015]Divljak——LCT维护parent树链并

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3881 对 S 建 SAM ,每个 T 会让 S 的 parent 树的链并答案+1:在 T ...

  2. AC自动机及KMP练习

    好久都没敲过KMP和AC自动机了.以前只会敲个kuangbin牌板子套题.现在重新写了自己的板子加深了印象.并且刷了一些题来增加自己的理解. KMP网上教程很多,但我的建议还是先看AC自动机(Trie ...

  3. [COCI2015]COCI

    [COCI2015]COCI 题目大意: 有\(n(n\le5\times10^5)\)个人比赛,比赛总共进行\(3\)轮,每一轮得分为\([0,650]\)内的整数.现在已经得知每个人前两轮的成绩. ...

  4. BZOJ3745: [Coci2015]Norma【CDQ】

    3745: [Coci2015]Norma 我们对于a序列分治,枚举左端点(从右往左)维护MINMINMIN和MAXMAXMAX,右端点同时更新两个指针j,k,表示a[mid+1,j]≤MAXa[mi ...

  5. bzoj 3743 [Coci2015]Kamp——树形dp+换根

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. "从根出发又回到根" 减去 "mx & ...

  6. BZOJ 3745: [Coci2015]Norma(分治)

    题意 给定一个正整数序列 \(a_1, a_2, \cdots, a_n\) ,求 \[ \sum_{i=1}^{n} \sum_{j=i}^{n} (j - i + 1) \min(a_i,a_{i ...

  7. [COCI2015]ZGODAN

    题目大意: 给你一个数$n(n\leq10^1000)$,定义一个数是"美丽数"当且仅当这个数各个数位上的数奇偶性不同. 求最接近$n$的"美丽数",若有多个, ...

  8. bzoj 3745 [Coci2015]Norma——序列分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个 ...

  9. linux chmod命令数字,菜鸟学Linux命令:chmod命令和数字文件权限

    chmod是一条在Unix系统中用于控制用户对文件的权限的命令(change mode单词前缀的组合)和函数. 只有文件所有者和超级用户可以修改文件或目录的权限.可以使用绝对模式,符号模式指定文件的权 ...

最新文章

  1. win7 64位安装mysql教程视频_64位Win7系统安装Mysql 5.7.22图文教程
  2. DL之CNN:卷积神经网络算法简介之原理简介——CNN网络的3D可视化(LeNet-5为例可视化)
  3. “物联网”架构有多重要?
  4. qc linux mysql 安装教程_linux下安装mysql
  5. IDEA2021配置Tomcat
  6. java dataset redis,利用Spring-Data-Redis和Jedis操作Redis缓存
  7. 【推荐实践】强化学习在美团“猜你喜欢”的实践
  8. ​最高要价 8888元,小米 11 邀请函现身闲鱼;荣耀与微软签署全球 PC 合作协议;Xfce 4.16 发布|极客头条...
  9. JSON.stringify和JSON.parse之间的区别
  10. 5-22近期工作总结、下一步工作安排及技术知识
  11. uniapp报错:Browserslist: caniuse-lite is outdated. Please run next command `npm update`
  12. 期末复习【操作系统】
  13. 微信京东手机怎么联系客服人工服务器,微信人工客服电话是多少?打不通怎么办?...
  14. VS Code, VS 2022 使用正则表达式进行替换
  15. 嘘!捡漏啦!1919元=高性能电脑,满额+500京东卡...
  16. 220927工作日志
  17. 高级人工智能之语音识别
  18. prctl()和pthread_setname_np()函数-设置线程名称
  19. 输入法中的全角和半角
  20. m4r转换工具html加载视频,在线m4r格式转换器

热门文章

  1. 六级词汇打卡第一天(一)
  2. pip下载安装与环境配置
  3. 高动态范围图像是什么
  4. 你为什么选择考研,考研对你的意义是什么?
  5. 你是怎么发现你的同事很有钱的?
  6. 一个人想生存发展具备3大关键
  7. 移动互联网将向“全真互联网”升级
  8. 今天看到头条好多新手说摆摊不挣钱
  9. 淘品牌”已去,“播品牌”正红
  10. 小企业如何才能做强做大?