传送门

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

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

代码如下:

#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. apiCloud事件发送与监听

    apiCloud事件发送与监听 1.sendEvent 将任意一个自定义事件广播出去,该事件可在任意页面通过 addEventListener 监听收到. sendEvent({params}) 2. ...

  2. typscript 语法1

    let isDone: boolean = false; let decLiteral: number = 0xf00d; let names: string = 'boob'; /** 使用模版字符 ...

  3. Mybatis知识(2)

    1.#{}和${}的区别是什么? 注:这道题是面试官面试我同事的. 答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静 ...

  4. 一步步实现 easyui datagrid表格宽度自适应,效果非常好

    一步步实现 easyui datagrid表格宽度自适应,效果非常好: 一.设置公共方法,使得datagrid的属性  fitColumns:true $(function(){ //初始加载,表格宽 ...

  5. ArcGIS案例学习笔记2_1

    ArcGIS案例学习笔记2_1 联系方式:谢老师,135_4855_4328,xiexiaokui#qq.com 时间:第二天上午 案例1:学校选址 内容:栅格数据分析 教程:pdf page=323 ...

  6. RESTORE 无法处理数据库 'Students',因为它正由此会话使用。建议在执行此操作时使用 master 数据库。

    恢复数据库是总弹出报错对话框如下:RESTORE 无法处理数据库 'Students',因为它正由此会话使用.建议在执行此操作时使用 master 数据库.RESTORE DATABASE 正在异常终 ...

  7. Linux下启动Tomcat启动并显示控制台日志信息

    Linux下如何启动Tomcat像Windows启动并显示控制台日志信息一样? Windows下启动tomcat,一般直接运行startup.bat,启动后如下图所示: Linux下直接启动./sta ...

  8. 修改hosts,***

    某些网站之所以在国内上不了,是因为dns受到干扰,无法解析出正确的ip地址. 可以在hosts文件中加入网站对应的正确ip地址,进行访问. 1.打开hosts文件,  路径为 C:\Windows\S ...

  9. 配置python学习环境遇到的问题:[Decode error - output not utf-8]

    因为前阵子学习monkeyrunner的时候,碰到了很多关于.py的脚本,其实我是一知半解的,也没打算去学习一下.将就着看看吧,后来无意中看到自动化测试工程师都要求会脚本语言的时候,刺激了我,想了想, ...

  10. Unable to get the default Bean Validation factory

    前几天看了一下教程 ,自己试着配置了一下web下的hibernate,悲剧的时,出错了提示下面: 信息: Hibernate Validator bean-validator-3.0-JBoss-4. ...