洛谷传送门

这是一道后缀自动机的模板题,这道题让我切身体会到了后缀自动机的方便与好写。

代码如下:

#include<bits/stdc++.h>
#define N 2000005
#define ll long long
using namespace std;
char s[N];
int a[N],siz[N],n,tot[N],root=1;
ll ans=0;
struct suf{
    int last,cnt,ch[N<<1][26],fa[N<<1],len[N];
    inline void build(){
        scanf("%s",s+1),last=cnt=1;
        int l=strlen(s+1);
        for(int i=1;i<=l;++i)insert(s[i]-'a');
    }
    inline void solve(){
        for(int i=1;i<=cnt;++i)++tot[len[i]];
        for(int i=1;i<=cnt;++i)tot[i]+=tot[i-1];
        for(int i=1;i<=cnt;++i)a[tot[len[i]]--]=i;
        for(int i=cnt;i;--i){
            int p=a[i];
            siz[fa[p]]+=siz[p];
            if(siz[p]>1)ans=max(ans,1ll*len[p]*siz[p]);
        }
        printf("%lld",ans);
    }
    inline void insert(int c){
        int p=last,newp=++cnt;
        last=newp,len[newp]=len[p]+1;
        for(;p&&!ch[p][c];p=fa[p])ch[p][c]=newp;
        if(!p)fa[newp]=root;
        else{
            int q=ch[p][c];
            if(len[p]+1==len[q])fa[newp]=q;
            else{
                int newq=++cnt;
                len[newq]=len[p]+1;
                memcpy(ch[newq],ch[q],sizeof(ch[q]));
                fa[newq]=fa[q],fa[q]=fa[newp]=newq;
                for(;ch[p][c]==q;p=fa[p])ch[p][c]=newq;
            }
        }
        siz[newp]=1;
    }
}sam;
int main(){
    sam.build();
    sam.solve();
    return 0;
}

2018.07.17 后缀自动机模板(SAM)的更多相关文章

  1. 后缀自动机模板 SAM

    一点疑问: 当创建nq节点时,要不要把nq的cnt标记赋值为1? 讲道理nq节点也是代表一个子串啊,不过网上的模板都没赋值. 2017.9.18 update: 把memset部分重写,改成用节点用到 ...

  2. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 A.串串-后缀自动机模板题

    链接:https://ac.nowcoder.com/acm/contest/558/A来源:牛客网 A.串串 小猫在研究字符串. 小猫在研究字串. 给定一个长度为N的字符串S,问所有它的子串Sl…r ...

  3. hdu4622(后缀自动机模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意: 先输入一个长度为 n 的字符串, 然后有 q 个形如 l, r 的询问, 对于每个询问 ...

  4. 2018.07.17 HAOI2016 找相同字符(SAM)

    传送门 就是给两个字符串,让你求公共字串的个数. 本来大佬们都是用的广义后缀自动机,但我感觉后缀自动机已经可以做这道题了.我们对其中一个字串建出后缀自动机,然后用另外一个后缀自动机在上面统计贡献即可. ...

  5. 后缀自动机(SAM)

    *在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...

  6. 【学习笔记】浅析后缀自动机(SAM)及基础应用

    解决子串相关问题的强大工具 我们知道一个长度为 \(n\) 的字符串中所有的子串数目为 \(O(n^2)\) 个,这很大程度上限制了我们对某些子串相关问题的研究.所以有没有解决方案,使得我们可以在可承 ...

  7. 后缀自动机(SAM)+广义后缀自动机(GSA)

    经过一顿操作之后竟然疑似没退役0 0 你是XCPC选手吗?我觉得我是! 稍微补一点之前丢给队友的知识吧,除了数论以外都可以看看,为Dhaka和新队伍做点准备... 不错的零基础教程见 IO WIKI ...

  8. 后缀自动机(SAM)学习笔记

    目录 定义 SAM 的状态集 一些性质 SAM 的后缀链接 SAM 的转移函数 一些性质 算法构造 构造方法 时间复杂度证明 状态的数量 转移的数量 代码实现 实际应用 统计本质不同的子串个数 计算任 ...

  9. POJ 1509 Glass Beads 后缀自动机 模板 字符串的最小表示

    http://poj.org/problem?id=1509 后缀自动机其实就是一个压缩储存空间时间(对节点重复利用)的储存所有一个字符串所有子串的trie树,如果想不起来长什么样子可以百度一下找个图 ...

随机推荐

  1. java基础思维导图,让java不再难懂

    java基础思维导图,让java不再难懂 原文链接  https://my.oschina.net/u/3080373/blog/873056 最近看了一些文章的思维导图,发现思维导图真是个强大的工具 ...

  2. MVC中数据传递 ViewBag的使用

    ViewBag MVC3中 ViewBag.ViewData和TempData的使用和差别 在MVC3開始.视图数据能够通过ViewBag属性訪问.在MVC2中则是使用ViewData.MVC3中保留 ...

  3. Oracle SQL Developer在进行查询的时候只显示50条数据

    在查询结果大于50条的时候,软件默认会只显示50条,向下拉会继续显示. 想要显示所有结果的话,光标放在结果集:ctrl+End或者是ctrl+PgDn都可以.

  4. mysql的collation-字符集

    utf8_general_ci               :排序规则 utf8 -- UTF-8 Unicode     :字符集 一.通过my.cnf文件增加(一劳永逸)两个参数:1.在[mysq ...

  5. vim nginx配置文件时具备语法高亮功能

    1.下载nginx.vim 下载页面:http://www.vim.org/scripts/script.php?script_id=1886 wget http://www.vim.org/scri ...

  6. JPEG和Variant的转换

    unit Unit1; interface uses   Windows, Messages, SysUtils, Classes, Graphics, Controls,       Forms, ...

  7. 面向对象三大特性一一继承(inheritance)和组合(Composition)

    记住2句话(常识),像个正常人思考! 1.“  is-a ”关系 用 继承! 学生是人,学生继承人这个类, 2. “has-a ”关系 用 组合!电脑有显卡,那么我们就在计算机类中增加显卡属性来复用显 ...

  8. sql语句执行的时间

    统计mysql里每条SQL语句执行的时间 收藏 CrazyHarry 发表于 2年前 阅读 3785 收藏 8 点赞 3 评论 3 Google.Github 双重认证前端课程,独家硅谷内容,每周直播 ...

  9. Excel日期处理

    short format = cell.getCellStyle().getDataFormat(); //其值为22 输入值类型为2018/6/28 17:25:48 if (format!=22) ...

  10. compression

    compression - 必应词典 美[kəmˈpreʃ(ə)n]英[kəm'preʃ(ə)n] n.压缩:加压:压紧:浓缩 网络压迫:压力:加压包扎