//给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. 在Spring Boot中加载初始化数据

    文章目录 依赖条件 data.sql文件 schema.sql 文件 @sql注解 @SqlConfig 注解 在Spring Boot中加载初始化数据 在Spring Boot中,Spring Bo ...

  2. 尤雨溪的vue怎么学,应该从vue-cli开始,为什么?

    带手机验证码登陆, 带全套购物车系统 带数据库 前后端分离开发 带定位用户功能 数据库代码为本地制作好了 带支付宝支付系统 带django开发服务器接口教程 地址:   https://www.dua ...

  3. 计算4的n次幂html代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 【Linux题目】第四关

    1. 如何过滤出已知当前目录下oldboy中的所有一级目录? 提示:不包含oldboy目录下面目录的子目录和隐藏目录,只要一级目录即可. 解答: ls -F|grep /   通过ls -F给目录后面 ...

  5. CSS样式1

    编写CSS样式: 1.标签的style属性 如:<div style="width:980px;"></div> 2.写在head里面,style标签中写样 ...

  6. ICML2016 TUTORIAL参会分享

    本次ICML会议的tutorial安排在主会前一天.这次tutorial内容非常丰富,有微软亚研的hekaiming(已经跳去facebook)介绍深度残差网络,也有deepmind的david si ...

  7. 什么是动态规划?动态规划的意义是什么?https://www.zhihu.com/question/23995189

    阮行止 上海洛谷网络科技有限公司 讲师 intro 很有意思的问题.以往见过许多教材,对动态规划(DP)的引入属于"奉天承运,皇帝诏曰"式:不给出一点引入,见面即拿出一大堆公式吓人 ...

  8. 图论--最短路--第K短路(IDA*)(IDA Star)模板

    #include <iostream> #include <cstdio> #include <cstring> #include <queue> us ...

  9. 图论--树的直径--DFS+树形DP模板

    #include <iostream> #include <cstring> using namespace std; //maxv:源点能到的最远点,maxdis:最远点对应 ...

  10. python(re 模块)

    1.re.match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. group() 以str形式返回对象中match的元素 start() 返回 ...