• 洛谷P3804 后缀自动机


    先贴板子,留坑

    #include<bits/stdc++.h>
    #define ll long long
    #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
    #define per(ii,a,b) for(int ii=b;ii>=a;--ii)
    using namespace std;//head
    const int maxn=2e6+10,maxm=27+10;
    int casn,n,m,k;
    namespace sam{
    int fa[maxn<<1],son[maxn<<1][maxm],len[maxn<<1];
    int last,cnt,t[maxn],val[maxn],num[maxn],a[maxn];
      void insert(int ch){
        int pos=last,npos=++cnt;
        last=npos,len[npos]=len[pos]+1;
        for(;pos&&!son[pos][ch];pos=fa[pos]) son[pos][ch]=npos;
        if(!pos) fa[npos]=1;
        else {
          int q=son[pos][ch];
          if(len[pos]+1==len[q]) fa[npos]=q;
          else {
            int nq=++cnt;len[nq]=len[pos]+1;
            memcpy(son[nq],son[q],sizeof(son[q]));
            fa[nq]=fa[q];fa[q]=fa[npos]=nq;
            for(;son[pos][ch]==q;pos=fa[pos]) son[pos][ch]=nq;
          }
        }
        val[npos]=1;
      }
      void makesam(char *s,int len){
        last=cnt=1;rep(i,1,len) insert(s[i]-'a');
      }
      ll getans(){
        ll ans=0;
        rep(i,1,cnt)++num[len[i]];
        rep(i,1,cnt)num[i]+=num[i-1];
        rep(i,1,cnt)a[num[len[i]]--]=i;
        per(i,1,cnt){
          int pos=a[i];val[fa[pos]]+=val[pos];
          if(val[pos]>1) ans=max(ans,1ll*val[pos]*len[pos]);
        }
        return ans;
      }
    }
    char s[maxn];
    int main(){IO;
      cin>>(s+1);n=strlen(s+1);
      sam::makesam(s,n);
      cout<<sam::getans()<<endl;
    }
    
  • 相关阅读:
    (参考)爬虫5-爬取中国大学排名情况
    005_软件安装之_常用办公软件
    004_软件安装之_Altium Designer
    001_基础硬件电路_二极管
    添加QQ群
    024_STM32程序移植之_ESP8266_TCP
    020_C语言常用函数
    004——转载C#禁止改变窗体大小
    003转载----C#打开网页
    002_Python基础学习网站
  • 原文地址:https://www.cnblogs.com/nervendnig/p/11518234.html
Copyright © 2020-2023  润新知