原文链接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. jquery日常使用总结

    1.如何跳出each循环 用 return false, 不是 break. $.each(resArray, function(j, n) { if (1 == n) { return false; ...

  2. 【原创】大数据基础之Spark(9)spark部署方式yarn/mesos

    1 下载解压 https://spark.apache.org/downloads.html $ wget http://mirrors.shu.edu.cn/apache/spark/spark-2 ...

  3. Spring 邮件发送

      前言:以前都是直接用Java自带的邮件工具发送邮件,现在Spring帮我们做了封装,提供了更好用更简单的发送邮件工具JavaMailSender 关于邮件服务器的设置就不在这里说了,直接去QQ邮箱 ...

  4. [Linux]流媒体服务器概述

    二.何为流媒体与流式传输? 2.1 流媒体 「流媒体」是指采用「流式传输」的方式在Internet播放的媒体格式,流媒体最大的特点就是「边下边播」,常用的流媒体格式有FLV(使用FLASH作为视频播放 ...

  5. ubuntu18.04安装xmind8

    1.先去官网下载:https://www.xmind.net/download/xmind8/ 2.默认下载到/home/guojihai/下载/目录下然后把xmind-8-update8-linux ...

  6. 16)django-ajax使用

    通过ajax可以悄悄的把数据传输给服务器,实现页面无刷新. 一:ajax使用语法 1)普通方式 ajax使用语法: $.ajax({ url:"/host", //提交到那里 ty ...

  7. iOS 中的block异常 判断block是否为空

    我们在调用block时,如果这个block为nil,则程序会崩溃,报类似于EXC_BAD_ACCESS(code=1, address=0xc)异常[32位下的结果,如果是64位,则address=0 ...

  8. java+appium 自动化环境搭建

    1.安装JDK1.7及以上 2.下载解压sdk并且配置环境变量: ANDROID_HOME:...\adt-bundle-windows-x86_64-20140702\sdk PATH:%ANDRO ...

  9. js调用ajax案例2,使用ok

    XMLHttpRequest 是 AJAX 的基础. XMLHttpRequest 对象所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject) ...

  10. Confluence 6 创建站点的导出文件

    希望为你的站点创建一个 XML 导出文件: 进入  > 基本配置(General Configuration) > 备份和恢复(Backup & Restore). 选择 归档到备 ...