后缀自动姬好,好写好调好ac

原题:

给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。两个方案不同当且仅当这两
个子串中有一个位置不同。
1 <=n1, n2<= 20000
 
之前写了个后缀数组+并查集的,因为我只会后缀数组……
后看看dalao们纷纷使用后缀自动姬秒题,决定提高一下自己姿势水平,学一发后缀自动姬
然后根本无法理解啊quq,现在板子差不多理解了,但是自动姬上做DP的延伸还是不能理解quq
多做题应该就能理解了吧……
这题dp具体思路是啥我也没搞懂,直接上结论
每个点的贡献:|right(x)|*(max[x]-max[fa[x]])
具体贡献到答案上,就搞一个b在当前节点上匹配的公共长度l,然后对答案的贡献就是|right(x)|*(l-max[fa[x]])
代码:
 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
char a[],b[]; int n,m;
int nxt[][],fa[],mx[],sz[];
int lst=,tt=;
int cnt[],cntrk[];
ll f[];
void ist(int x){
int p=lst,np=lst=++tt;
mx[np]=mx[p]+; sz[np]=;
while(!nxt[p][x] && p) nxt[p][x]=np,p=fa[p];
if(!p) fa[np]=;
else{
int q=nxt[p][x];
if(mx[p]+==mx[q]) fa[np]=q;
else{
int nq=++tt; mx[nq]=mx[p]+;
memcpy(nxt[nq],nxt[q],sizeof(nxt[q]));
fa[nq]=fa[q],fa[q]=fa[np]=nq;
while(nxt[p][x]==q) nxt[p][x]=nq,p=fa[p];
}
}
}
void gtcntrk(){
for(int i=;i<=tt;++i) ++cnt[mx[i]];
for(int i=;i<=n;++i) cnt[i]+=cnt[i-];
for(int i=tt;i;--i) cntrk[cnt[mx[i]]--]=i;
}
void gtf(){
for(int i=tt;i;--i) sz[fa[cntrk[i]]]+=sz[cntrk[i]];
for(int i=;i<=tt;++i)
f[cntrk[i]]=f[fa[cntrk[i]]]+(ll)sz[cntrk[i]]*(mx[cntrk[i]]-mx[fa[cntrk[i]]]);
}
int main(){//freopen("ddd.in","r",stdin);
scanf("%s%s",a+,b+); n=strlen(a+),m=strlen(b+);
for(int i=;i<=n;++i) ist(a[i]-'a');
gtcntrk(),gtf();
ll bwl=; int l=,tmp=,x;
for(int i=;i<=m;++i){
x=b[i]-'a';
if(nxt[tmp][x]) tmp=nxt[tmp][x],++l;
else{
while(!nxt[tmp][x] && tmp) tmp=fa[tmp];
if(!tmp) tmp=,l=;
else l=mx[tmp]+,tmp=nxt[tmp][x];
}
if(tmp!=) bwl+=f[fa[tmp]]+(ll)sz[tmp]*(l-mx[fa[tmp]]);
}
cout<<bwl<<endl;
return ;
}

【BZOJ4566】【HAOI2016】找相同字符的更多相关文章

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

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

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

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

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

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

  4. BZOJ4566 [Haoi2016]找相同字符 字符串 SAM

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4566.html 题目传送门 - BZOJ4566 题意 给定两个字符串 $s1$ 和 $s2$ ,问有 ...

  5. BZOJ4566: [Haoi2016]找相同字符

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

  6. BZOJ4566: [Haoi2016]找相同字符(后缀自动机)

    题意 题目链接 Sol 直接在SAM上乱搞 枚举前缀,用SAM统计可以匹配的后缀,具体在匹配的时候维护和当前节点能匹配的最大值 然后再把parent树上的点的贡献也统计上,这部分可以爆跳parent树 ...

  7. BZOJ4566 Haoi2016 找相同字符【广义后缀自动机】

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

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

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

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

    题目 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. 输入格式 两行,两个字符串s1,s2,长度分别为n1,n2.1 & ...

  10. BZOJ4566 HAOI2016找相同字符(后缀自动机)

    对第一个串建SAM,第二个串在上面跑,记录当前前缀匹配的最长后缀长度l,每次考虑当前前缀的贡献,对于当前所在节点显然是|right|*(l-len[fa]),而对于其parent树上所有祖先的贡献显然 ...

随机推荐

  1. List在遍历中删除t元素

    法一:使用普通for循环遍历 注意: 1.从头开始循环,每次删除后 i  减一.             2.从尾开始循环. public class Main { public static voi ...

  2. 愛與痛的邊緣--IPA--粤语

    谭咏麟和王菲的版本各有味道.

  3. (C/C++学习笔记) 二十一. 异常处理

    二十一. 异常处理 ● 异常的概念 程序的错误通常包括:语法错误.逻辑错误.运行异常. 语法错误指书写的程序语句不合乎编译器的语法规则,这种错误在编译.连接时由编译器指出. 逻辑错误是指程序能顺利运行 ...

  4. 安装babel

    http://jamesknelson.com/using-es6-in-the-browser-with-babel-6-and-webpack/

  5. 3.4 C++名字隐藏

    参数:http://www.weixueyuan.net/view/6361.html 总结: 如果派生类中新增一个成员变量,该成员变量与基类中的成员变量同名,则新增的成员变量就会遮蔽从基类中继承过来 ...

  6. js正则学习

    一直对正则很纠结也很畏惧,以前感觉花时间理解一个个奇奇怪怪的符号,还不如直接百度谷歌之. 但知其然不知其所以然也是种痛苦,所以花了两天稍微学了一下,虽然没学很深入彻底,但也比之前进步不少,特此笔记. ...

  7. static全局变量与普通全局变量的区别,static局部变量与普通局部变量的区别,static函数与普通函数的区别

    static全局变量与普通全局变量的区别 static全局变量和普通全局变量的存储方式没有不同,如果它们都已经初始化,那么存放在进程的数据段中,否则存放在bss段.这两者的不同点在于作用域不同,当一个 ...

  8. fk的使用细节

    在seiman的博客fk2.3的用法笔记一文中,介绍了当震中距很大时,fk在使用时需要加上-f,这一展平变换的选项. 另外,nt*dt为最终数据的总长度,当震中距为远震范围时,such as:40°, ...

  9. L296 EST 科技英语翻译-美学取向 (上)

    tips:对语言进行恰如其分的润饰,讲究词法.句法及篇章的粘连,增加可读性. 1 Accuracy 精确性 科技文章用词要求准确,尽量避免含糊不清和一词多义 dead air静空气 2 Paralle ...

  10. L260

    Innovative UK technology that can deliver drugs deep into the brain to treat neurological diseases, ...