• 后缀自动机 模板


    SAM板子,没什么好说的

    建出来SAM然后跑个DFS统计答案就行了

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #define ll long long 
     6 #define N 3010
     7 #define rint register int
     8 #define il inline
     9 #define idx(x) (x-'a'+1)
    10 using namespace std;
    11 //re
    12 char str[N];
    13 int head[N<<1];
    14 int cte;
    15 struct Edge{int to,nxt;}e[N<<1];
    16 void ae(int u,int v){cte++;e[cte].to=v,e[cte].nxt=head[u],head[u]=cte;}
    17 struct SAM{
    18     int fa[N<<1],trs[N<<1][28],dep[N<<1],sum[N<<1],sz[N<<1],cnt,last;
    19     void init(){cnt=last=1;}
    20     void ins(int x)
    21     {
    22         int p=last,np=++cnt,q,nq;
    23         last=np,dep[np]=dep[p]+1;
    24         for(;p&&!trs[p][x];p=fa[p]) trs[p][x]=np;
    25         if(!p){fa[np]=1;}
    26         else{
    27             q=trs[p][x];
    28             if(dep[q]==dep[p]+1) fa[np]=q;
    29             else{
    30                 fa[nq=++cnt]=fa[q];
    31                 fa[q]=fa[np]=nq;
    32                 dep[nq]=dep[p]+1;
    33                 memcpy(trs[nq],trs[q],sizeof(trs[q]));
    34                 for(;p&&trs[p][x]==q;p=fa[p]) trs[p][x]=nq;
    35             }
    36         }
    37     }
    38     ll dfs(int x)
    39     {
    40         ll ans=0;
    41         for(int j=head[x];j;j=e[j].nxt){
    42             int v=e[j].to;
    43             ans=max(ans,dfs(v));
    44             sz[x]+=sz[v],sum[x]+=sum[v];
    45         }sz[x]++;
    46         if(sz[x]==1) {sum[x]++;return 0;}
    47         else {return max(ans,1ll*sum[x]*dep[x]);}
    48     }
    49 }sam;
    50 
    51 int main()
    52 {
    53     freopen("testdata.in","r",stdin);
    54     scanf("%s",str+1);
    55     int len=strlen(str+1);
    56     sam.init();
    57     for(int i=len;i>=1;--i)
    58         sam.ins(idx(str[i]));
    59     for(int i=2;i<=sam.cnt;i++)
    60         ae(sam.fa[i],i);
    61     printf("%lld
    ",sam.dfs(1));
    62     return 0;
    63 }
  • 相关阅读:
    Integer类的parseInt和valueOf的区别
    华为实习小结
    程序员浪费生命的几种方式
    移动前端中viewport(视口) 转
    Console API 与命令行
    Ajax
    浏览器缓存机制
    mysql之各种命令总结
    jquery file upload 文件上传插件
    文件上传插件uploadify详解
  • 原文地址:https://www.cnblogs.com/guapisolo/p/9715073.html
Copyright © 2020-2023  润新知