zoukankan      html  css  js  c++  java
  • Luogu SP8222 NSUBSTR

    题意:求 (f(i),iin[1,n])(f(i)) 表示长度为 (i) 的子串中,出现的最大次数。

    (SAM)

    通过 (parent 树) 子树和求出 (|{ m endpos}(p)|) ,然后 (ans[{ m len}(p)]={ m max}(ans[{ m len}(p)],|{ m endpos}(p)|)) ,最后 (ans[i]={ m max}(ans[i+1],ans[i]))

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define R register int
    using namespace std;
    namespace Luitaryi {
    const int N=500010;
    int n,lst=1,tot=1;
    int c[N][26],fa[N],len[N],sz[N],d[N],mem[N],ans[N];
    char s[N>>1];
    inline void add(int ch) {
      R p=lst,np=lst=++tot;
      sz[np]=1;
      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 main() {
      scanf("%s",s+1),n=strlen(s+1);
      for(R i=1;i<=n;++i) add(s[i]-'a');
      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;
      for(R i=tot;i;--i) {
        R u=mem[i];
        sz[fa[u]]+=sz[u];
        ans[len[u]]=max(ans[len[u]],sz[u]);
      } for(R i=n-1;i;--i) ans[i]=max(ans[i],ans[i+1]);
      for(R i=1;i<=n;++i) printf("%d
    ",ans[i]);
    }
    } signed main() {Luitaryi::main(); return 0;}
    

    2020.01.10

  • 相关阅读:
    Java开发环境搭建
    MySQL优化
    js正则表达式,验证身份证
    获取urlc参数
    Oracle解锁
    Qt 常用类 (4)—— QPoint
    Qt 常用类——QStandardItemModel
    Qt QTableWidget用法总结
    Qt 随机数
    C++ static类成员,static类成员函数
  • 原文地址:https://www.cnblogs.com/Jackpei/p/12177408.html
Copyright © 2011-2022 走看看