zoj3995 fail树
//给n个串 求两个串的(最长)公共后缀, 如果这个后缀是1个串的前缀 ,那么++ans,求ans
/*
对所有串建立AC自动机,那么若前缀ii 是前缀jj 的后缀,说明ii 是Fail树上jj 的祖先。
所以对于询问(x,y)(x,y) ,答案就是两点在Fail树上的LCA在原Trie中子树内的字符串总数。
时间复杂度O(nlogn)O(nlogn) 。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树的更多相关文章
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- fail树
前置技能:AC自动机 假设我们有了一个AC自动机,然后在上面进行字符串匹配. 上面是一个有四个字符串的AC自动机(abcde.aacdf.cdf.cde),虚线是fail指针,实线是转移. 这是上一次 ...
- 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组
E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
- 【BZOJ 2434】【NOI 2011】阿狸的打字机 fail树
完全不会啊,看题解还看了好久,我是蒟蒻$QAQ$ $zyf$的题解挺好的:http://blog.csdn.net/clove_unique/article/details/51059425 $fai ...
- BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)
题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...
- 【BZOJ-2434】阿狸的打字机 AC自动机 + Fail树 + DFS序 + 树状数组
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2022 Solved: 1158[Submit][Sta ...
- NOI2011阿狸的打字机(fail树+DFS序)
Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...
随机推荐
- java 8 Stream中操作类型和peek的使用
目录 简介 中间操作和终止操作 peek 结论 java 8 Stream中操作类型和peek的使用 简介 java 8 stream作为流式操作有两种操作类型,中间操作和终止操作.这两种有什么区别呢 ...
- 【EditPlus】参数设置
1. 设置javac,java快捷键 工具-参数设置-工具-用户工具 组和工具项-组名,更改组名为“java” 添加工具 javac 菜单文字:javac 命令:安装java的javac.exe的绝对 ...
- uboot on qemu
1, download uboot ftp://ftp.denx.de/pub/u-boot/ 2, compile uboot make vexpress_ca9x4_config export A ...
- CodeForces - 1047A
A. Little C Loves 3 I time limit per test1 second memory limit per test256 megabytes inputstandard i ...
- CodeForces - 1245F Daniel and Spring Cleaning (数位DP)
While doing some spring cleaning, Daniel found an old calculator that he loves so much. However, it ...
- python(面向对象-类封装调用)
一.面对对象思想 (1)大家肯定听过 Python 中”一切皆对象“的说法,但可能并不了解它的具体含义,只是在学习的时候听说 Python 是面向对象的编程语言,本节将向大家详细介绍 Python 面 ...
- Jmeter 数据库测试参数化
1.JDBC Request 参数化 方法一.Jmeter 参数化,在 sql query 中使用变量 Jmeter 参数化,使用 csv 参数化 sql query 中使用 ${变量名} 引用 方法 ...
- centos安装libconfig
安装很简单,生成的.so文件会被安装到/usr/local/lib目录,记得修改/etc/profile. 安装过程会出现两个错误: What is makeinfo, and how do I ge ...
- FMT/FWT学习笔记
目录 FMT/FWT学习笔记 FMT 快速莫比乌斯变换 OR卷积 AND卷积 快速沃尔什变换(FWT/XOR卷积) FMT/FWT学习笔记 FMT/FWT是算法竞赛中求or/and/xor卷积的算法, ...
- Spring官网阅读 | 总结篇
接近用了4个多月的时间,完成了整个<Spring官网阅读>系列的文章,本文主要对本系列所有的文章做一个总结,同时也将所有的目录汇总成一篇文章方便各位读者来阅读. 下面这张图是我整个的写作大 ...