• SP10570 LONGCS


    题意:多个串的最长公共子串。

    (SAM)

    把第一个串插进去,之后的每个串都在上面跑。

    对于每一个串记录在每个点的最长匹配 (mx[]) 数组;跑完后更新父亲的答案,并且每个点与已有答案取 ( m min)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define R register int
    using namespace std;
    namespace Luitaryi {
    inline int g() { R x=0,f=1;
      register char s; while(!isdigit(s=getchar())) f=s=='-'?-1:f;
      do x=x*10+(s^48); while(isdigit(s=getchar())); return x*f;
    }
    const int N=500010;
    int n,lst=1,tot=1,ans;
    int len[N],fa[N],c[N][26],d[N],mem[N],mx[N],mn[N];
    char s[N];
    inline void add(int ch) {
      R p=lst,np=lst=++tot;
      len[np]=len[p]+1;
      for(;p&&!c[p][ch];p=fa[p]) c[p][ch]=np;
      if(!p) fa[np]=1;
      else {
        R q=c[p][ch];
        if(len[q]==len[p]+1) fa[np]=q;
        else {
          R nq=++tot;
          memcpy(c[nq],c[q],26<<2);
          fa[nq]=fa[q],len[nq]=len[p]+1;
          fa[np]=fa[q]=nq;
          for(;p&&c[p][ch]==q;p=fa[p]) c[p][ch]=nq;
        }
      }
    }
    inline void solve() {
      R p=1,l=0;
      for(R i=1;i<=n;++i) {
        R ch=s[i]-'a';
        for(;p&&!c[p][ch];) p=fa[p],l=len[p];
        if(!p) p=1,l=0;
        else p=c[p][ch],++l,mx[p]=max(mx[p],l);
      }
      for(R i=tot;i;--i) {
        R p=mem[i];
        mx[fa[p]]=max(mx[fa[p]],min(mx[p],len[fa[p]]));
        mn[p]=min(mn[p],mx[p]);
      } memset(mx,0,sizeof mx);
    }
    inline void main() {
      R T=g(); while(T--) {
        R k=g(); ans=0;
        memset(c,0,(tot+1)*104);
        lst=tot=1;
        scanf("%s",s+1),n=strlen(s+1);
        for(R i=1;i<=n;++i) add(s[i]-'a');
        memset(d,0,(n+1)<<2);
        for(R i=1;i<=tot;++i) ++d[len[i]];
        for(R i=1;i<=n;++i) d[i]+=d[i-1];
        for(R i=1;i<=tot;++i) mem[d[len[i]]--]=i;
        memset(mn,0x3f,sizeof mn);
        for(R i=1;i<k;++i) 
          scanf("%s",s+1),n=strlen(s+1),solve();
        for(R i=1;i<=tot;++i) ans=max(ans,mn[i]);
        printf("%d
    ",ans);
      }
    }
    } signed main() {Luitaryi::main(); return 0;}
    

    2020.01.10

  • 相关阅读:
    树莓派开机黑屏只有光标无法进入图形界面桌面
    Python GDAL矢量转栅格详解
    Emacs基础使用教程及常见命令整理
    Elasticsearch
    微信公众号正确使用开放标签wxopenlaunchweapp
    Docker安装Clickhouse
    Docker 常用命令
    Spring Cloud Gateway java.lang.IllegalStateException: Invalid host: lb://manage_web
    安卓手机上部署nodejs服务器
    企业物联网平台如何选择?
  • 原文地址:https://www.cnblogs.com/Jackpei/p/12177431.html
Copyright © 2020-2023  润新知