zoukankan      html  css  js  c++  java
  • zoj3995 fail树

    //给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+88; const int M=5e5+88; 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][26],val[M],rt,sz,fail[M]; void modify(int tc) { for(int i=0;i<26;++i) ch[tc][i]=-1; H[tc]=val[tc]=heavy[tc]=0; } void init(){ sz=rt=0;modify(0); } void insert(char *s,int ic){ int u=rt,lens=strlen(s); for(int i=0;i<lens;++i){ int id=s[i]-'a'; if(ch[u][id]==-1) ++sz,modify(sz),ch[u][id]=sz; u=ch[u][id]; ++val[u]; } pos[ic]=u; } void build(){ queue<int>Q; for(int i=0;i<26;++i) if(ch[0][i]==-1) ch[0][i]=0;else Q.push(ch[0][i]),fail[ch[0][i]]=0; while(!Q.empty()){ int u=Q.front(); Q.pop(); for(int i=0;i<26;++i) { if(ch[u][i]==-1) ch[u][i]=ch[fail[u]][i]; else Q.push(ch[u][i]),fail[ch[u][i]]=ch[fail[u]][i]; } } for(int i=1;i<=sz;++i) nxt[i]=H[fail[i]],H[fail[i]]=i; dfs1(0); dfs2(0,0); } void dfs1(int u){ size[u]=1; for(int i=H[u];i;i=nxt[i]) { d[i]=d[u]+1; 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 ",ans); } }AC; int main(){ while(scanf("%d",&n)!=EOF){ AC.init(); for(int i=1;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); } } }
  • 相关阅读:
    HDU 5045 5047 5050 5053(上海网络赛E,F,I,L)
    Xcode 5、Xcode 6 免证书真机调试
    Ubuntu打开终端的方法三种
    JAVA异常处理机制
    Java多线程之~~~~synchronized 方法
    iphone开发技术要学习的内容
    表达式求值(数据结构书上栈的应用之中的一个)
    Java学习篇之---json-lib(Maven)
    Nginx 笔记与总结(16)nginx 负载均衡
    SPSS数据记录的选择(Select Cases)
  • 原文地址:https://www.cnblogs.com/mfys/p/8243194.html
Copyright © 2011-2022 走看看