传送门

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

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

代码如下:

#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. 创建DataSnap Server

    DataSnap REST Application http://edn.embarcadero.com/article/41305 2017.1.19 官方例子 https://community. ...

  2. C#--抽象工厂设计模式原理

    C#--抽象工厂设计模式原理 C#--抽象工厂设计模式--三层框架 C#--使用反射改进简单工厂

  3. eclipse从svn导入maven项目变成普通项目解决办法

    右击项目-->configure-->Convert to Maven Project

  4. mysql 2003: Can't connect to MySQL server on '127.0.0.1:3306' (99)

    连接断开的频率太高导致报错,可以在每次连接之间sleep,或者保持一个长连接. ref:https://stackoverflow.com/questions/24884438/2003-cant-c ...

  5. SOA和微服务到底是什么关系

    本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...

  6. 富文本编辑器-UEditor

    官方网址:http://ueditor.baidu.com/website/index.html 下载地址:http://ueditor.baidu.com/website/download.html ...

  7. jstl遍历list的jsp

    jstl,核心标签库,使用,<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%& ...

  8. 启用SQL Server 2008的专用管理员连接(DAC)

    参考:http://technet.microsoft.com/zh-cn/library/ms178068(v=SQL.105).aspx 问题: 一个在我们公司实习的DBA向我询问如何开启SQL ...

  9. hive sql 随机抽样

    create table daizk.IOS_matrix_sex asselect *from zhujx.1029_IOS_features_replce_nullwhere sex = 'M'u ...

  10. dp-最长公共子序列

    最长公共子序列(NYOJ36) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公 ...