zoukankan      html  css  js  c++  java
  • SPOJ 1812 LCS2 后缀自动机

    Code:

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #define setIO(s) freopen(s".in","r",stdin)
    #define maxn 30000 
    #define N 29 
    using namespace std;
    char str[maxn]; 
    int n[N],id,tot=1,last=1,ans; 
    struct SAM{
        int f[maxn], ch[maxn][N],dis[maxn],C[maxn],rk[maxn],fin[maxn],mx[maxn];      
        void ins(int c){
            int p=last,np=++tot; last=np; dis[np]=dis[p]+1;fin[np]=dis[np]; 
            while(p&&!ch[p][c])ch[p][c]=np,p=f[p];
            if(!p) f[np]=1;
            else{
                int q=ch[p][c],nq;
                if(dis[q]==dis[p]+1) f[np]=q;
                else{
                    nq=++tot;
                    dis[nq]=dis[p]+1; fin[nq]=dis[nq]; 
                    memcpy(ch[nq],ch[q],sizeof(ch[q]));
                    f[nq]=f[q],f[q]=f[np]=nq;
                    while(p&&ch[p][c]==q) ch[p][c]=nq,p=f[p];
                }
            }
        }
        void update(){
            int p=1,l=0; 
            for(int i=0;i<n[id];++i){
                int c=str[i]-'a';
                while(p&&!ch[p][c]) p=f[p],l=dis[p]; 
                if(ch[p][c]) mx[ch[p][c]]=max(mx[ch[p][c]],++l),p=ch[p][c];
                else p=1,l=0;       
            }     
            for(int i=tot;i>=1;--i) {
                int p=rk[i];
                mx[f[p]]=max(mx[f[p]],min(dis[f[p]],mx[p])); 
                fin[p]=min(fin[p],mx[p]); 
                mx[p]=0; 
            }
        }
        void build(){
            for(int i=1;i<=tot;++i) ++C[dis[i]];
            for(int i=1;i<=tot;++i) C[i]+=C[i-1]; 
            for(int i=1;i<=tot;++i) rk[C[dis[i]]--]=i; 
        }
        void ma(){
            memset(C,0,sizeof(C));
            memset(rk,0,sizeof(rk));
            memset(mx,0,sizeof(mx));
            memset(fin,0,sizeof(fin));
            memset(ch,0,sizeof(ch));
            memset(f,0,sizeof(f));
            memset(dis,0,sizeof(dis));
        }
    }sam; 
    int main(){
        //setIO("input");  
        int cc; scanf("%d",&cc);
        while(cc--) 
        {
            id=0;
            tot=last=1;
            ans=0;
            memset(n,0,sizeof(n));
            sam.ma(); 
            int uu; scanf("%d",&uu); 
            scanf("%s",str),n[++id]=strlen(str);
            for(int i=0;i<n[id];++i) sam.ins(str[i]-'a'); 
            sam.build(); 
            for(int i=1;i<uu;++i) scanf("%s",str),n[++id]=strlen(str),sam.update(); 
            for(int i=1;i<=tot;++i) ans=max(ans,sam.fin[i]); 
            printf("%d
    ",ans); 
        }  
        return 0; 
    }
    

      

  • 相关阅读:
    PHP设计模式
    PHP设计模式
    PHP 23种设计模式
    MySQL 中的共享锁和排他锁的用法
    PHP_MySQL高并发加锁事务处理
    Connection: close和Connection: keep-alive有什么区别
    罗辑思维首席架构师:Go微服务改造实践
    真诚与尊重是技术团队的管理要点
    10种常见的软件架构模式
    百亿级微信红包的高并发资金交易系统设计方案
  • 原文地址:https://www.cnblogs.com/guangheli/p/10304352.html
Copyright © 2011-2022 走看看