P3181 [HAOI2016]找相同字符

后缀自动机
(正解应是广义后缀自动机
并不会广义后缀自动机。
然鹅可以用普通的后缀自动机。
 
我们先引入一个问题:算出从一个串内取任意两个不重合子串完全相同的方案数。
显然,对于每个点$w$,$tot+=siz[w]*(siz[w]-1)/2*(len[w]-len[fa[w]])$
$siz[w]$表示该点对应子串出现次数
那么答案即为$tot_{a+b}-tot_a-tot_b$
计算$tot_{a+b}$时在$a,b$间插入一个特殊字符即可。(插入$'{'='z'+1$较方便)
attention:数组需要开n*2*2=800000大小!
 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 800005
int n; char s1[N],s2[N];
long long ans,tot;
struct Sam{
int nxt[N][],len[N],siz[N],fa[N];
int p,q,last,ed,a[N],c[N];
void clear(){
last=ed=;
memset(fa,,sizeof(fa));
memset(nxt,,sizeof(nxt));
memset(len,,sizeof(len));
memset(siz,,sizeof(siz));
memset(c,,sizeof(c));
}
void add(int c){
p=last; len[last=++ed]=len[p]+; siz[ed]=;
for(;p&&!nxt[p][c];p=fa[p]) nxt[p][c]=ed;
if(!p){fa[ed]=; return;}
q=nxt[p][c];
if(len[q]==len[p]+){fa[ed]=q; return;}
len[++ed]=len[p]+;
memcpy(nxt[ed],nxt[q],sizeof(nxt[q]));
fa[ed]=fa[q]; fa[q]=fa[ed-]=ed;
for(;nxt[p][c]==q;p=fa[p]) nxt[p][c]=ed;
}//裸的板子
void calc(){
for(int i=;i<=ed;++i) ++c[len[i]];
for(int i=;i<=ed;++i) c[i]+=c[i-];
for(int i=;i<=ed;++i) a[c[len[i]]--]=i;//对len进行排序代替dfs
for(int i=ed;i;--i){
int w=a[i]; siz[fa[w]]+=siz[w];
tot+=1ll*siz[w]*(siz[w]-)/*(len[w]-len[fa[w]]);//累计每个点的贡献
}
}
}sam;
void solve(char *v,int x){
tot=; n=strlen(v+); sam.clear();
for(int i=;i<=n;++i) sam.add(v[i]-'a');
sam.calc(); ans+=tot*x;
}
int main(){
scanf("%s",s1+); scanf("%s",s2+);
solve(s1,-); solve(s2,-);
strcat(s1+,"{"); strcat(s1+,s2+);
solve(s1,); printf("%lld",ans);
return ;
}

bzoj4566 / P3181 [HAOI2016]找相同字符的更多相关文章

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

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

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

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

  3. BZOJ4566:[HAOI2016]找相同字符——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4566 https://www.luogu.org/problemnew/show/P3181 给定 ...

  4. Bzoj4566:[HAOI2016]找相同字符

    题面 Bzoj Sol 两个串拼在一起后求出后缀数组 然后显然的\(n^2\)暴力,就是直接枚举求\(LCP\) 又由于扫的时候是对\(height\)取\(min\) 那么可以用单调栈维护每一段的贡 ...

  5. Luogu P3181 [HAOI2016]找相同字符 广义$SAM$

    题目链接 \(Click\) \(Here\) 设一个串\(s\)在\(A\)中出现\(cnt[s][1]\)次,在\(B\)中出现\(cnt[s][2]\)次,我们要求的就是: \[\sum cnt ...

  6. P3181 [HAOI2016]找相同字符

    思路 广义SAM 把两个字符串建成广义SAM,然后统计两个SAM中相同节点的endpos大小乘积即可 记得开long long 代码 #include <cstdio> #include ...

  7. [洛谷P3181][HAOI2016]找相同字符

    题目大意:给你两个字符串,求从两个字符串中各选择一个字串使得这两个字串相同的方案数. 题解:建广义$SAM$,对每个点求出在第一个串中出现次数和第二个串中出现次数,乘起来就行了 卡点:无 C++ Co ...

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

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

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

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

随机推荐

  1. synchronized的简单用法

    synchronized 锁定要操作的对象: emp: synchronized(要锁定的对象){ //要做的动作 }

  2. [Java in NetBeans] Lesson 06. Custom classes

    这个课程的参考视频和图片来自youtube. 主要学到的知识点有: Constructors: A special method called when an object of the class ...

  3. [LeetCode] 1. Two Sum_Easy

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  4. glibc降级尝试失败-兼使用另一个版本的glibc

    https://cnodejs.org/topic/56dc21f1502596633dc2c3dc 这个介绍的是升级的情况.降级,网上说很难.因为用yum是无法降级安装的.我仿造升级的方式,make ...

  5. unity3d-多媒体与网络

    1.音乐 unity3d 共支持4种音乐的格式文件 aiff:适用于较短的音乐文件,可用于游戏音效 wav:适用于较短的音乐文件,可用于游戏音效 mp3:适用于较长的音乐文件,可用于游戏音乐 ogg: ...

  6. 记录一则完整的SPA(10g->11g)测试过程

    生产端:Windows 2008 + Oracle 10.2.0.5 测试端:RHEL 6.5 + Oracle 11.2.0.4 需求:因为Oracle跨越大版本,优化器.新特性变动较多,需要进行S ...

  7. 实验源码,DES,AES,RSA,椭圆曲线

    https://pan.baidu.com/s/1CPA-bnLmcJR_AFsNImhUjQ

  8. NHibernate之旅系列文章导航

    NHibernate之旅系列文章导航 宣传语 NHibernate.NHibernate教程.NHibernate入门.NHibernate下载.NHibernate教程中文版.NHibernate实 ...

  9. featuremap尺寸的计算

    对于卷积层,向下取整 对于池化层:想上取整 output=((input+2*pad-dilation*(kernel-1)+1)/stride)+1 input:输入尺寸 output:输出尺寸 p ...

  10. 《大话设计模式》c++实现 抽象工厂模式

    为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间 ...