SPOJ 1812 LCS2 后缀自动机

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\n",ans); 
    }  
    return 0; 
}

  

posted @ 2019-01-22 16:02 EM-LGH 阅读( ...) 评论( ...) 编辑 收藏
根据原作 https://pan.quark.cn/s/0ed355622f0f 的源码改编 野火IM解决方案 野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。 主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。 详细情况请参考在线文档。 主要包括一下项目: 野火IM Vue Electron Demo,演示如何将野火IM的能力集成到Vue Electron项目。 前置说明 本项目所使用的是需要付费的,价格请参考费用详情 支持试用,具体请看试用说明 本项目默认只能连接到官方服务,购买或申请试用之后,替换,即可连到自行部署的服务 分支说明 :基于开发,是未来的开发重心 :基于开发,进入维护模式,不再开发新功能,鉴于已经终止支持且不再维护,建议客户升级到版本 环境依赖 mac系统 最新版本的Xcode nodejs v18.19.0 npm v10.2.3 python 2.7.x git npm install -g node-gyp@8.3.0 windows系统 nodejs v18.19.0 python 2.7.x git npm 6.14.15 npm install --global --vs2019 --production windows-build-tools 本步安装windows开发环境的安装内容较多,如果网络情况不好可能需要等较长时间,选择早上网络较好时安装是个好的选择 或参考手动安装 windows-build-tools进行安装 npm install -g node-gyp@8.3.0 linux系统 nodej...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值