//给n个串  求两个串的(最长)公共后缀, 如果这个后缀是1个串的前缀 ,那么++ans,求ans
/*

对所有串建立AC自动机,那么若前缀ii 是前缀jj 的后缀,说明ii 是Fail树上jj 的祖先。

所以对于询问(x,y)(x,y) ,答案就是两点在Fail树上的LCA在原Trie中子树内的字符串总数。

时间复杂度O(nlogn)O(nlog⁡n) 。http://www.cnblogs.com/clrs97/p/8215277.html    claris*/


#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+;
const int M=5e5+;
int pos[N],n,x,y,d[M],top[M],heavy[M],H[M],nxt[M],size[M],m;
char s[M];
struct Ac{
int ch[M][],val[M],rt,sz,fail[M];
void modify(int tc) {
for(int i=;i<;++i) ch[tc][i]=-;
H[tc]=val[tc]=heavy[tc]=;
}
void init(){
sz=rt=;modify();
}
void insert(char *s,int ic){
int u=rt,lens=strlen(s);
for(int i=;i<lens;++i){
int id=s[i]-'a';
if(ch[u][id]==-) ++sz,modify(sz),ch[u][id]=sz;
u=ch[u][id];
++val[u];
}
pos[ic]=u;
}
void build(){
queue<int>Q;
for(int i=;i<;++i) if(ch[][i]==-) ch[][i]=;else Q.push(ch[][i]),fail[ch[][i]]=;
while(!Q.empty()){
int u=Q.front();
Q.pop();
for(int i=;i<;++i) {
if(ch[u][i]==-) ch[u][i]=ch[fail[u]][i];
else Q.push(ch[u][i]),fail[ch[u][i]]=ch[fail[u]][i];
}
}
for(int i=;i<=sz;++i) nxt[i]=H[fail[i]],H[fail[i]]=i;
dfs1();
dfs2(,);
}
void dfs1(int u){
size[u]=;
for(int i=H[u];i;i=nxt[i]) {
d[i]=d[u]+;
dfs1(i);
size[u]+=size[i];
if(!heavy[u]) heavy[u]=i;
else if(size[heavy[u]]<size[i]) heavy[u]=i;
}
}
void dfs2(int x,int y){
top[x]=y;
if(heavy[x]) dfs2(heavy[x],y);
for(int i=H[x];i;i=nxt[i]) if(i!=heavy[x]) dfs2(i,i);
}
int lca(int x,int y){
while(top[x]!=top[y]) {if(d[top[x]]<d[top[y]]) swap(x,y);x=fail[top[x]];}
return d[x]<d[y]?x:y;
}
void query(int x,int y){
int ans=val[lca(pos[x],pos[y])];
if(!ans) puts("N");else printf("%d\n",ans);
}
}AC;
int main(){
while(scanf("%d",&n)!=EOF){
AC.init();
for(int i=;i<=n;++i) scanf("%s",s),AC.insert(s,i);
AC.build();
for(scanf("%d",&m);m--;){
scanf("%d%d",&x,&y);
AC.query(x,y);
}
}
}

zoj3995 fail树的更多相关文章

  1. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  2. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

  3. fail树

    前置技能:AC自动机 假设我们有了一个AC自动机,然后在上面进行字符串匹配. 上面是一个有四个字符串的AC自动机(abcde.aacdf.cdf.cde),虚线是fail指针,实线是转移. 这是上一次 ...

  4. 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组

    E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  5. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

  6. 【BZOJ 2434】【NOI 2011】阿狸的打字机 fail树

    完全不会啊,看题解还看了好久,我是蒟蒻$QAQ$ $zyf$的题解挺好的:http://blog.csdn.net/clove_unique/article/details/51059425 $fai ...

  7. BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)

    题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...

  8. 【BZOJ-2434】阿狸的打字机 AC自动机 + Fail树 + DFS序 + 树状数组

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2022  Solved: 1158[Submit][Sta ...

  9. NOI2011阿狸的打字机(fail树+DFS序)

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...

随机推荐

  1. JS实现元素的全屏、退出全屏功能

     在实际开发中,我们很可能需要实现某一元素的全屏和退出全屏功能,如canvas.所幸的是,js提供了相关api用来处理这一问题,只需简单的调用requestFullScreen.exitFullScr ...

  2. python笔记 函数初识

    1. 函数: 封装一个功能 def    my_len(形参):          ->  def  声明定义一个函数   my_len 函数名命名规则同变量 ······          - ...

  3. 配置secondarynamenode主机名masters

    1.配置hadoop的secondarynamenode,配置内容如下 node2 本文转自 素颜猪 51CTO博客,原文链接:http://blog.51cto.com/suyanzhu/19592 ...

  4. 图论--最小生成树--Prim算法(带边输出)模板

    #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 100 ...

  5. 题解 AT4867 【[ABC155D] Pairs】

    题目 两次二分 首先对ans进行二分,在\([-10^{18},10^{18}]\)之间 考虑怎么check 对于每个ans,枚举每个\(a_i\),二分查找有几个\(a_j\),使得\(a_i\ti ...

  6. 安装KubeSphere

    1. KubeSphere 是什么 1.1. 官方解释 KubeSphere是一个分布式操作系统,提供以Kubernetes为核心的云原生堆栈,旨在成为第三方应用程序的即插即用架构,以促进其生态系统的 ...

  7. Linux之《荒岛余生》(一)准备篇

    xin片之争,已经暴露了中国xin的问题,我等码农束手无策:而在操作系统方面,成果也是乏善可陈:现如今酷炫的Web监控工具,让很多研发丧失了真正处理问题的能力. 越接近底层,就越接近真相,在计算机的世 ...

  8. 自定义比较器(IComparer接口的实现)

    class FileNameSort : IComparer { [System.Runtime.InteropServices.DllImport("Shlwapi.dll", ...

  9. 修改MySQL表中的字段属性

    登录数据库 >mysql -u root -p 数据库名称 查询所有数据表 mysql>show tables; 查询表的字段信息 mysql>desc 表名称; 1.修改某个表的字 ...

  10. Coda docs

    a doc,反过来就是coda,有点冷. 对我而言,在线文档的好处在于在线数据库.存放代码等. Quip能高亮代码,但有时墙内不香,害得我用APP查看记录.Slite能高亮代码,但表格功能弱.号称al ...