原文链接https://www.cnblogs.com/zhouzhendong/p/CF542E.html

题目传送门 - CF452E

题意

  给定三个字符串 $s1,s2,s3$ ,对于所有 $L\in{1,2,\cdots,min(|s1|,|s2|,|s3|)}$ ,输出 $f(L)$ 。

  其中 $f(L)$ 表示满足 $s_k[i_k,\cdots,i_k+L-1]$ 全部相同的 $i_1,i_2,i_3$ 的个数。

  答案对 $10^9+7$ 取模。

  $|s1|+|s2|+|s3|\leq 3\times 10^5$

题解

  第二次写广义后缀自动机,居然又只写了 20 分钟??然而没有看到取模,以及一个取模上面的傻逼错误续了我 15 分钟。

  把三个串全部扔进广义后缀自动机里面。

  对于每一个状态,分别算出属于这三个串的 right 集合大小。

  然后对于每一个节点,方案总数就是 $\prod_{k=0}^{2}right_{i,k}$ ,影响的长度范围是 $(\rm{Max(father),Max(i)}]$ ,相当于区间加,直接差分一下就可以了。

  最后回答的时候前缀和一下就好了。注意取模。

代码

#include <bits/stdc++.h>
#define right __fjw82
using namespace std;
const int N=300005,S=N*2,mod=1e9+7;
char s[N];
int n=1e9,in[S],q[S],ans[N],right[S][3],head,tail;
int root,size;
struct SAM{
int Next[26],fa,Max;
}t[N<<1];
void init(){
memset(t,0,sizeof t);
root=size=1;
t[0].Max=-1;
for (int i=0;i<26;i++)
t[0].Next[i]=1;
}
int extend(int p,int c){
if (t[p].Next[c]&&t[p].Max+1==t[t[p].Next[c]].Max)
return t[p].Next[c];
int np=++size,q,nq;
t[np].Max=t[p].Max+1;
for (;!t[p].Next[c];p=t[p].fa)
t[p].Next[c]=np;
q=t[p].Next[c];
if (t[p].Max+1==t[q].Max)
t[np].fa=q;
else {
nq=++size;
t[nq]=t[q],t[nq].Max=t[p].Max+1;
t[q].fa=t[np].fa=nq;
for (;t[p].Next[c]==q;p=t[p].fa)
t[p].Next[c]=nq;
}
return np;
}
int main(){
init();
for (int i=0,now;i<3;i++){
scanf("%s",s+1);
n=min(n,now=strlen(s+1));
for (int j=1,p=root;j<=now;j++)
right[p=extend(p,s[j]-'a')][i]++;
}
for (int i=2;i<=size;i++)
in[t[i].fa]++;
head=tail=0;
for (int i=2;i<=size;i++)
if (in[i]==0)
q[++tail]=i;
while (head<tail){
int x=q[++head];
for (int i=0;i<3;i++)
right[t[x].fa][i]+=right[x][i];
in[t[x].fa]--;
if (t[x].fa>1&&!in[t[x].fa])
q[++tail]=t[x].fa;
}
memset(ans,0,sizeof ans);
for (int i=2;i<=size;i++){
int add=1LL*right[i][0]*right[i][1]*right[i][2]%mod;
(ans[t[t[i].fa].Max+1]+=add)%=mod;
(ans[t[i].Max+1]+=mod-add)%=mod;
}
for (int i=1;i<=n;i++){
ans[i]=(ans[i]+ans[i-1])%mod;
printf("%d ",ans[i]);
}
return 0;
}

  

Codeforces 452E Three strings 字符串 SAM的更多相关文章

  1. Codeforces 316G3 Good Substrings 字符串 SAM

    原文链接http://www.cnblogs.com/zhouzhendong/p/9010851.html 题目传送门 - Codeforces 316G3 题意 给定一个母串$s$,问母串$s$有 ...

  2. Codeforces 235C Cyclical Quest 字符串 SAM KMP

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF235C.html 题目传送门 -  CF235C 题意 给定一个字符串 $s$ ,多组询问,每组询问的形式为 ...

  3. Codeforces 873F Forbidden Indices 字符串 SAM/(SA+单调栈)

    原文链接https://www.cnblogs.com/zhouzhendong/p/9256033.html 题目传送门 - CF873F 题意 给定长度为 $n$ 的字符串 $s$,以及给定这个字 ...

  4. Codeforces 452E Three Strings(后缀自动机)

    上学期很认真地学了一些字符串的常用工具,各种 suffix structre,但是其实对后缀自动机这个部分是理解地不太透彻的,以致于看了师兄A这题的代码后,我完全看不懂,于是乎重新看回一些学习后缀自动 ...

  5. Codeforces 700E. Cool Slogans 字符串,SAM,线段树合并,动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任 ...

  6. Codeforces 762C Two strings 字符串

    Cpdeforces 762C 题目大意: 给定两个字符串a,b\((len \leq 10^5)\),让你去b中的一个连续的字段,使剩余的b串中的拼接起来的两个串是a穿的子序列.最大化这个字串的长度 ...

  7. [Codeforces 452E] Three Strings

    [题目链接] https://codeforces.com/contest/452/problem/E [算法] 构建后缀数组 用并查集合并答案即可 时间复杂度 : O(NlogN) [代码] #in ...

  8. Codeforces Round #358 (Div. 2) D. Alyona and Strings 字符串dp

    题目链接: 题目 D. Alyona and Strings time limit per test2 seconds memory limit per test256 megabytes input ...

  9. codeforces 112APetya and Strings(字符串水题)

    A. Petya and Strings 点击打开题目 time limit per test 2 seconds memory limit per test 256 megabytes input ...

随机推荐

  1. Linux下怎样搜索文件

    使用linux系统难免会忘记文件所在的位置,可以使用以下命令对系统中的文件进行搜索.搜索文件的命令为”find“:”locate“:”whereis“:”which“:”type“   方法/步骤   ...

  2. ubuntu 问题

    1.打开ubuntu之后的开启页面出现:所选模式均不匹配可能的模式:为 CRTC 63 尝试模式CRTC 63:尝试 800x600@60Hz 模式输出在 1366x768@60Hz (通过 0)CR ...

  3. ER/数据库建模工具之MySQL Workbench的使用

    参考:https://blog.csdn.net/soulandswear/article/details/60966808 待后续整理...

  4. O(big oh) (big omega) (big theta)

    big oh big omega big theta more

  5. javascript移动端禁止页面滑动的解决方案

    1 前言 移动端网页,发现ios平台的iphone或者ipad,网页可以上下左右移动,而Android版则不会.仅作为记录使用. 2 代码 var mo=function(e){e.preventDe ...

  6. Servet

    一.Servlet 是单例吗 不是. 1.你可以用多个 URL 映射同一个 Servlet.这样就会出现多个实例. 2.看看 Servlet 定义: 引用 For a servlet not host ...

  7. 不能够连接到主机(名称为localhost)上的MySQL服务”

    不能够连接到主机(名称为localhost)上的MySQL服务” -如果是服务未启动.那么就右键‘计算机’---->管理--->服务和应用程序---->服务,在右侧的栏目中找到名称为 ...

  8. Oracle_plsql_开发工具搭建最小化客户端

    一:资源下载获取路径: 二:配置方法 1:前提是安装好plsql开发工具 具体安装步骤略 2:配置 简化版的客户端工具. 具体格式:可以参照下文来修改编写使用. orcl_1521 = (DESCRI ...

  9. 【Web】servlet、filter和listener

    一般地,servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是:context-param -> listener -> filter -&g ...

  10. jquery 中多选和全选