//给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. 修改mysql配置中my.conf中max_allowed_packet变量

    mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置 show VARIABLES ...

  2. 徐州赛区网络预赛 D Easy Math

    比赛快结束的适合看了一下D题,发现跟前几天刚刚做过的HDU 5728 PowMod几乎一模一样,当时特兴奋,结果一直到比赛结束都一直WA.回来仔细一琢磨才发现,PowMod这道题保证了n不含平方因子, ...

  3. 本周ASP.NET英文技术文章推荐[02/03 - 02/16]:MVC、Visual Studio 2008、安全性、性能、LINQ to JavaScript、jQuery...

    摘要 继续坚持,继续推荐.本期共有9篇文章: 最新的ASP.NET MVC框架开发计划 Visual Studio 2008 Web开发相关的Hotfix发布 ASP.NET安全性教程系列 ASP.N ...

  4. 数学--数论--HDU 6128 Inverse of sum (公式推导论)

    Description 给nn个小于pp的非负整数a1,-,na1,-,n,问有多少对(i,j)(1≤i<j≤n)(i,j)(1≤i<j≤n)模pp在意义下满足1ai+aj≡1ai+1aj ...

  5. [bzoj2088]P3505 [POI2010]TEL-Teleportation

    洛谷 bzoj 用了分层图的思想 题意 给一张图,要求你再尽可能的多连边,使得从1到2至少要经过5条边 没啥复杂的公式,讲解都在注释里 #include<cstdio> #include& ...

  6. P2542 【[AHOI2005]航线规划】

    P2542 [[AHOI2005]航线规划] 一个无向图,m个操作 删去一条边 给定两个点,求有多少边使得如果这条边不存在,给定的两个点不连通 一般这种删边的题目,考虑逆序加边处理 在删完的图中,任意 ...

  7. MySQL 索引、视图

    1.索引 什么是索引 一个索引是存储在表中的数据结构,索引在表的列名上创建.索引中包含了一个列的值,这些值保存在一个数据结构中 索引优缺点 索引大大提高了查询速度 会降低更新表的速度,如对表进行INS ...

  8. TCP的三次握手四次挥手理解及面试题

    一.TCP概述 每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字, 例如,若IP地址为192.0.0.1 而端口号为8000,那么得到 ...

  9. [译]ANDROID 11: BETA 计划

    当我们开始计划 Android 11 的时候,我们没有预料到这些变化会发生在我们所有人身上,几乎遍及世界上的每一个地区. 这些挑战要求我们保持灵活性,寻找新的合作方式,特别是与我们的开发者社区合作. ...

  10. 01_互联网基本原理和HTML入门

    从"上网"说开去 1.上网就是请求数据 老师现在进行一个互联网原理的整体感知的教学,你注意,整体感知中,一些具体的细节,可能令你没有安全感(很多的知识盲点).没有关系,老师进行的是 ...