传送门

就是给两个字符串,让你求公共字串的个数。

本来大佬们都是用的广义后缀自动机,但我感觉后缀自动机已经可以做这道题了。我们对其中一个字串建出后缀自动机,然后用另外一个后缀自动机在上面统计贡献即可。

代码如下:

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

2018.07.17 HAOI2016 找相同字符(SAM)的更多相关文章

  1. 2018.07.17 后缀自动机模板(SAM)

    洛谷传送门 这是一道后缀自动机的模板题,这道题让我切身体会到了后缀自动机的方便与好写. 代码如下: #include<bits/stdc++.h> #define N 2000005 #d ...

  2. BZOJ4566:[HAOI2016]找相同字符(SAM)

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...

  3. BZOJ4566 [Haoi2016]找相同字符【SAM】

    BZOJ4566 [Haoi2016]找相同字符 给定两个字符串\(s和t\),要求找出两个字符串中所有可以相互匹配的子串对的数量 首先考虑可以怎么做,我们可以枚举\(t\)串的前缀\(t'\),然后 ...

  4. BZOJ 4566: [Haoi2016]找相同字符 [后缀自动机]

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 275  Solved: 155[Submit][Statu ...

  5. bzoj4566 / P3181 [HAOI2016]找相同字符

    P3181 [HAOI2016]找相同字符 后缀自动机 (正解应是广义后缀自动机) 并不会广义后缀自动机. 然鹅可以用普通的后缀自动机.   我们先引入一个问题:算出从一个串内取任意两个不重合子串完全 ...

  6. [Bzoj4566][Haoi2016]找相同字符(广义后缀自动机)

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 861  Solved: 495[Submit][Statu ...

  7. 【BZOJ4566】[HAOI2016]找相同字符

    [BZOJ4566][HAOI2016]找相同字符 题面 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 其中\(1\le ...

  8. [BZOJ4566][Haoi2016]找相同字符 后缀自动机+dp

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1212  Solved: 694[Submit][Stat ...

  9. 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈

    [BZOJ4566][Haoi2016]找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同 ...

随机推荐

  1. Windows下MySQL5.6查找my.ini配置文件

    在DOS命令行窗口登录MySQL,输入如下命令查看MySQL的安装目录和数据存放目录,MySQL的配置文件就在数据存放目录下: 另外一种方法: 在"开始 → 所有程序 → MySQL&quo ...

  2. UI5-文档-4.11-Pages and Panels

    在完成了应用程序结构的所有工作之后,是时候改进我们的应用程序的外观了.在这一步中,您还将了解控件聚合. Preview A panel is now displaying the controls f ...

  3. python数据分析笔记——数据加载与整理]

    [ python数据分析笔记——数据加载与整理] https://mp.weixin.qq.com/s?__biz=MjM5MDM3Nzg0NA==&mid=2651588899&id ...

  4. 最短路径-Dijkstra算法(转载)

    注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始 ...

  5. SQL 数据库主键 ,外键

    主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个 ...

  6. proxychains 安装

    一.安装下载源码: git clone https://github.com/rofl0r/proxychains-ng 编译和安装: cd proxychains-ng ./configure -- ...

  7. Linux Tomcat重新启动

    在Linux系统下,重启Tomcat使用命令操作的! 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查看 ...

  8. SpringCloud 简单理解

    0.SpringCloud,微服务架构.包括 服务发现(Eureka),断路器(Hystrix),服务网关(Zuul),客户端负载均衡(Ribbon).服务跟踪(Sleuth).消息总线(Bus).消 ...

  9. MyEclipse/eclipse 添加作者、注释、版本、时间等

    preferences>>java>>code style>>code templates>>comments>>找到相应的编辑即可

  10. Ubuntu 分辨率更改 xrandr Failed to get size of gamma for output default

    sudo vim /etc/xorg.conf copy: Section "Monitor" Identifier "Monitor0" VendorName ...