//给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. 精确计算微信小程序scrollview高度,全机型适配

    众所周知,可以滑动的 scroll 组件在移动端非常的重要,几乎每个页面都要用到. 而小程序的 scroll-view 组件就比较坑了,非得指定一个高度才能正常使用.布局复杂的时候谁还给你算高度啊.. ...

  2. Native Boot 从一个 VHD 引导系统的相关说明

    Native Boot 是 Windows 7 和 Windows Server 2008 R2 提供的一个新的功能,它允许从一个 VHD 文件引导一个操作系统,但是需要注意的是目前的 Windows ...

  3. 用Eclipse开发项目,你不能不知道的快捷键

    1. 编辑快捷键 编辑快捷键 介绍 psvm + Tab 生成main方法 sout + tab 生成输出语句 Ctrl+X / Ctrl + Y 删除一行 Ctrl+D 复制一行 Ctrl+/ 或 ...

  4. 图论--割边--Tarjan模板

    #include<iostream> #include<stdio.h> #include<vector> using namespace std; const i ...

  5. jmeter4.0,启动jmeter.bat闪退问题

    问题描述: 电脑重装win10系统,配置好了java环境后,解压jmeter的zip包,然后按照网上的教程配置环境变量,然后兴冲冲启动jmeter.bat,结果,闪退,甚至连个报错信息都没有... 然 ...

  6. redis系列之5----redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  7. qt creator源码全方面分析(4-3)

    内外命名空间 QtCreator源码中,每一个子项目都有内外两层命名空间,一个是外部的,一个是内部的. 示例如下 namespace ExtensionSystem { namespace Inter ...

  8. Dubbo(七):redis注册中心的应用

    上篇我们讲了Dubbo中有一个非常本质和重要的功能,那就是服务的自动注册与发现,而这个功能是通过注册中心来实现的.上篇中使用zookeeper实现了注册中心的功能,同时了提了dubbo中有其他许多的注 ...

  9. spring学习笔记(六)自定义spring-boot-starter(2)

    上篇文章我们主要讲了spring自动装配的原理,我们知道了springboot在启动的时候会自动去读.factories文件,在factories文件中,autoConfiguration对应的就是我 ...

  10. Vue + Element-ui实现后台管理系统(4)---封装一个ECharts组件的一点思路

    封装一个ECharts组件的一点思路 有关后台管理系统之前写过三遍博客,看这篇之前最好先看下这三篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-system ...