[Codeforces452E]Three strings(后缀自动机)

Redhawk-SC输入件配置中的5个常见错误及解决方法 本文针对Redhawk-SC功耗与可靠性签核工具,深入剖析了输入件配置中工艺文件错配、DEF文件路径、时序文件格式、电源网络模型及宏模型处理这5个最常见且棘手的错误。文章提供了资深工程师验证过的实战解决方案与检查清单,旨在帮助用户规避风险,提升配置效率与分析准确性,确保芯片签核流程的顺利进行。 阅读详情

=== ===

这里放传送门

=== ===

题解

首先可以想到如果能求出每一个子串在三个串中分别的出现次数 (a,b,c) ,那么答案就是把每个子串的 a,b,c 都乘起来再加起来。对于求所有子串相关的问题很容易想到后缀自动机,而这个题有多个串那么就是广义后缀自动机。因为广义后缀自动机可以识别这三个串的所有子串,并且相同的子串会记录在相同的节点上。那么只要建立自动机以后每个节点开三个域,对三个串分别统计它Right集合的大小就可以了。注意最后统计答案的时候不能像求最大值一样用f[i]更新f[i-1],因为这样会出现重复。所以每个节点的答案必须严格加到 [Min(s),Max(s)] 这一段区间上去。这里使用了差分的方法。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const long long Mod=1e9+7;
char S[300010];
int len,cnt,Min,v[1000010],b[1000010];
long long f[300010];
struct Node{
    Node *ch[27],*fa;
    int step,R[5];
    Node();
}*null,*Root,t[1000010],*last,*p,*q,*np,*nq;
Node::Node(){
    for (int i=0;i<=26;i++) ch[i]=null;
    fa=null;step=0;
    for (int i=0;i<5;i++) R[i]=0;
}
Node* New(){++cnt;t[cnt]=Node();return t+cnt;}
void insert(int x,int id){
    p=last;
    if (p->ch[x]!=null){
        q=p->ch[x];
        if (q->step==p->step+1){
            last=q;q->R[id]++;return;
        }//如果有这个节点就直接跳转
        nq=New();nq->step=p->step+1;nq->R[id]++;
        memcpy(nq->ch,q->ch,sizeof(q->ch));
        nq->fa=q->fa;q->fa=nq;
        while (p->ch[x]==q){p->ch[x]=nq;p=p->fa;}
        last=nq;return;
    }
    last=np=New();
    np->step=p->step+1;np->R[id]=1;
    while (p->ch[x]==null&&p!=null){
        p->ch[x]=np;p=p->fa;
    }
    if (p==null){np->fa=Root;return;}
    q=p->ch[x];
    if (q->step==p->step+1){np->fa=q;return;}
    nq=New();nq->step=p->step+1;
    memcpy(nq->ch,q->ch,sizeof(q->ch));
    nq->fa=q->fa;q->fa=np->fa=nq;
    while (p->ch[x]==q){p->ch[x]=nq;p=p->fa;}
}
void Getord(){
    for (int i=1;i<=cnt;i++) ++b[t[i].step];
    for (int i=1;i<=cnt;i++) b[i]+=b[i-1];
    for (int i=cnt;i>=1;i--) v[b[t[i].step]--]=i;
    for (int i=cnt;i>=1;i--){
        Node *now=t+v[i];
        for (int j=1;j<=3;j++)
          now->fa->R[j]+=now->R[j];
    }
}
int main()
{
    null=new Node;*null=Node();
    Root=last=New();
    Min=0x7fffffff;
    for (int i=1;i<=3;i++){
        gets(S);len=strlen(S);
        Min=min(Min,len);
        last=Root;
        for (int j=0;j<len;j++)
          insert(S[j]-'a',i);
    }
    Getord();
    for (int i=1;i<=cnt;i++){
        long long x=1;
        Node *now=t+i;
        int v=now->step,L,R;
        if (now->step==0) continue;
        for (int j=1;j<=3;j++)
          x=(x*(long long)now->R[j])%Mod;
        L=now->fa->step+1;R=now->step;
        f[L]=(f[L]+x)%Mod;f[R+1]=(f[R+1]-x)%Mod;
    }
    for (int i=1;i<=cnt;i++) f[i]=(f[i]+f[i-1])%Mod;
    for (int i=1;i<=Min;i++)
      printf("%I64d%c",(f[i]+Mod)%Mod," \n"[i==Min]);
    return 0;
}
【JCR一区级】鱼鹰算法OOA-CNN-LSTM-Attention故障诊断分类预测【含Matlab源码 5711期】 鱼鹰算法OOA-CNN-LSTM-Attention故障诊断分类预测 完整代码和数据,方可运行;数据可直接替换,适合小白!可提供运行操作视频! 阅读详情

相关推荐

RK3566基于Buildroot定制QT开发环境的完整指南

本文详细介绍了如何在RK3566开发板上使用Buildroot定制QT开发环境的完整流程。从基础环境搭建、Buildroot初始配置到QT模块选择与编译验证,提供了实战经验和常见问题解决方案,帮助开发者高效完成嵌入式Linux下的QT开发环境部署。

weixin_26804345的博客 357

codeforces 802I 后缀自动机

题意:给你一个字符串,统计他的所有不同子串的出现次数的平方和,n<=100000n<=100000 其实相当于一个SAM的模板题吧。 首先你要理解SAM的存储方式以后就可以轻松切这题。。 SAM建立了一个parent树还有一个DAG,这里显然和DAG没什么关系。 对于parent树上的每个节点,他有一个right集,存储这一些子串的右端点下标,同时还有一个对应区间min(len),max(

老臣 592

2026 AI编程环境安装指南:从下载、部署到流式验证

AI编程环境已不再是传统软件安装,而是融合硬件兼容性、模型运行时与IDE插件协同的系统工程。其核心原理在于:本地GPU驱动需匹配量化运行时(如Ollama v0.3+对CUDA 12.1+的强制要求),协议层依赖gRPC流式响应,生态层则要求插件签名与模型源可信校验。这一技术组合显著提升AI代码生成的实时性与生产就绪度,支撑微服务开发、CI/CD智能补全、本地LLM推理等关键场景。本文聚焦AI编程软件下载与安装过程中的可复现部署实践,覆盖macOS/WSL2双平台、NVMe模型加速、离线校验及原子化功能验证

weixin_30480075的博客 581

CodeForces 235C(后缀自动机)

(http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105904#problem/F) 题意:给定串s,Q组查询字符串a,问s有多少子串可由a循环构成。 解法:对s构造后缀自动机,将每个a复制成aa进行查询,要注意,s的每个子串可能和a的很多循环串相同,但只能算一次。#include <cstdio> #include <cstring>

r_clover的博客 473

内网穿透-frp二层隧道搭建

环境: weblogic: 192.168.0.133 10.10.20.12 win7 : 10.10.20.7 10.10.10.7go语言、跨平台的 可以分为frpc和frps frpc—>请求----->frps frps:放到黑客公网上 1.需要出网 2.配置: frpc:放到肉鸡上,请求frps 2.端口转发 2.1frpc传到肉鸡(weblogic) 利用工具,传入内存马到weblogic,然后使用冰蝎进行连接 然后在文件管理中上传frpc.exe和frpc.ini文件 fr

yyytaotao的博客 2100

3D医学影像分割新突破:手把手教你用MedSAM2快速标注CT/MRI数据(附3D Slicer插件配置)

本文详细介绍了如何利用MedSAM2模型进行3D医学影像分割,包括从环境准备到3D Slicer插件配置的全流程。通过实战案例和技巧分享,帮助医疗从业者快速掌握CT/MRI数据的高效标注方法,提升医学影像分析的准确性和效率。

ujm5678901的博客 298

CodeForces - 452E Three strings

题意: 给定三个字符串 s1,s2,s3s_1, s_2, s_3s1​,s2​,s3​,问对每个 l(l≤min⁡{∣s1∣,∣s2∣,∣s3∣})l(l \leq \min\{|s_1|, |s_2|, |s_3|\})l(l≤min{∣s1​∣,∣s2​∣,∣s3​∣}),有多少个三元组 (i1,i2,i3)(i_1, i_2, i_3)(i1​,i2​,i3​) 满足 sk[ik,⋯ ,i...

weixin_44059127的博客 197

《iOS之一起进大厂》系列-秒杀面试官的RunLoop底层原理面试题

Runloop是iOS面试中的必考题,不管大厂小厂都会问到。 这里包括了Runloop几乎所有的面试题,还有中肯完整的答案解释。

空杯子 1151

Codeforces Round #846 (Div. 2) G. Delicious Dessert(后缀自动机sam/后缀数组sa)

Codeforces Round #846 (Div. 2) G. Delicious Dessert(后缀自动机/后缀数组)

小衣同学的博客 859

数据库系统工程师软考备战:第三篇 - SQL语言深入解析与应用

​​创建表​​​修改表​​​删除表​。

Programming Talk 121

一文讲透 SAP SD:把报价、订单、交付、开票串成一条可落地的业务闭环

摘要:SAP SD(销售与分销)模块是企业O2C(订单到收款)流程的核心,管理从客户意向到回款的完整链路。该模块围绕销售订单、交付、开票等关键环节,与财务、物料管理等模块深度集成。SD的核心在于主数据管理、单据驱动流程、定价规则引擎和信用风控,通过条件技术实现复杂定价策略,并支持多维度分析。典型应用场景包括多渠道销售企业的价格体系管理、信用控制和物流协同,有效解决销售与交付脱节、财务对账困难等业务痛点。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 511

Codeforces round 146 C - Cyclical Quest(后缀自动机)

Codeforces round 146 C - Cyclical Quest 题意:给出一个字符串s,这里我称之为母串,然后再给出n个子串,n 解题思路:拿到这题,第一想法就是后缀自动机。。做法是这样的,先给母串建sam,为了解决同构问题,我们将读进来的子串复制一遍,除去最后一个字符。然后拿复制好的字串去自动机上跑,要记录的是当前能匹配的最长长度是多少,如果能匹配的长度大于等原子串长度,

No__stop 1591

fatal: unable to access ‘https://github.com/Stability-AI/stablediffusion.git/‘解决方案

本文主要介绍在安装 stable-diffusion-webui 时出现的 fatal: unable to access 'https://github.com/Stability-AI/stablediffusion.git/': Failed to connect to github.com port 443 after 21071 ms: Couldn't connect to server 问题的解决方案,希望能对你有所帮助。

水滴的博客 5684

【后缀自动机】CodeForces 452E Three strings

通道:http://codeforces.com/problemset/problem/452/E 题意:给了三个串,问对于长度为l的串,满足(i1,i2,i3)(s1[i1..i1+l-1]==s2[i2...i2+l-1]==s3[i3+...i3+l-1])有多少组,输出长度为1-min(|s1|,|s2|,|s3|)的有多少组。 思路:对3个串共同建立SAM.每串末尾加个标记...

210

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

上学期很认真地学了一些字符串的常用工具,各种 suffix structre,但是其实对后缀自动机这个部分是理解地不太透彻的,以致于看了师兄A这题的代码后,我完全看不懂,于是乎重新看回一些学习后缀自动机的博客和代码,重新理解了一些概念,感觉自己对于后缀自动机的理解深了一些。 先说说题意,给了三个串,问对于长度为x的串,满足(i1,i2,i3)(s1[i1..i1+k-1]==s2[i2...

weixin_30566111的博客 111

【CodeForces452E】Three strings

【题目链接】点击打开链接【思路要点】建立多串后缀树,每个节点对答案数组的贡献可以描述为一次区间加操作,差分+前缀和即可。时间复杂度\(O(\sum|S|)\)。【代码】#include&lt;bits/stdc++.h&gt; using namespace std; const int MAXN = 300005; const int P = 1e9 + 7; template &lt;type...

cz_xuyixuan的博客 468

[Codeforces 452E] Three Strings

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

215

Codeforces 452E Three strings 后缀数组 + 并查集

题目大意: 就是现在给出三个总长度不超过3*10^5的字符串, 每个字符串只包含字母'a' ~ 'z', 现在对于每一个L, (1 大致思路: 首先不难想到后缀数组处理三个串拼接起来的总串, 记录每一个字符的来源, 也就是记录每个后缀的来源, 然后需要根据height数组从大到小来利用并查集标记区间进行计算, 注意两个区间合并的时候之后 (i, j, k)三者不来自同一个原来的区间

Gatevin的专栏 1158

codeforces 452E. Three strings 后缀数组

题意:给三个串s1,s2,s3,对于每个长度L(1<=L<=min(length(s1,s2,s3)))求有多少个三元组<p1,p2,p3>使得s1[p1...p1+L-1]==s2[p2..p2+L-1]==s3[p3..p3+L-1],求出所有L对应的答案对1e9+7取模。 题解: 先把串连在一起,记录每个位置所属的串,跑一下后缀数组求出height数组。 如果从...

qq_39898877的博客 327

codeforces 452E Three strings 后缀数组+并查集

给三个串s1,s2,s3,对于meig

Broken Wings 978

Codeforces 452E Three strings 字符串 SAM

原文链接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]$ 全...

weixin_30672019的博客 164

Codeforces 后缀数组 题目汇总

模板1(字符串从0开始读入) const int N=2e5+10,inf=0x3f3f3f3f; int sa[N]; int rk[N]; int tmp[N]; int lcp[N]; char s[N],t[N]; int n,k; bool cmp(int i,int j){ if(rk[i] != rk[j]) return rk[i]<rk[j]; else...

qq_39898877的博客 562

Codeforces Round #244 (Div. 2)D (后缀自动机)

Codeforces Round #244 (Div. 2)D (后缀自动机) (标号为0的节点一定是null节点,无论如何都不能拿来用,切记切记,以后不能再错了) 这题用后缀自动机的话,对后缀自动机的很多性质有足够深刻的理解。没想过后缀数组怎么做,因为不高兴敲。。。。 题意:给出两个长度均不超过5000的字符串s1,s2,求这两个串中,都只出现一次的最短公共子串。 解题思路:求的是公共子

No__stop 1567

Codeforces Round #166 (Div. 2) D. Good Substrings——后缀自动机

题意:规定每一个字符的”好坏“,求字符串中坏的字符不超过k个的不同的子串有多少个。 数据量是允许n^2的算法过的,一看坏字符的个数是满足区间减法的,就反应过来可以用hash搞了。但是自动机肯定也可以做的。 按照拓扑序遍历每个状态,如果当前状态p的pre状态所表示的最长的子串的坏字符个数大于k的话,那这个状态所表示的子串肯定都不满足条件;否则我们就计算出该状态所表示的所有子串中满足条件有多少个,

cool_Fires的专栏 845

Codeforces 235 C(后缀自动机)

传送门 题意: 给你一个主串strstrstr以及nnn个模式串。问你这nnn个模式串的所有循环同构在主串strstrstr中的出现次数。 题目分析: 这是一个需要转换思维的题目。 首先,如果题目中不要求我们求每一个模式串的循环同构的出现此时,显然这道题我们直接可以...

weixin_30641999的博客 199

Codeforces 1037H Security 后缀自动机+线段树

题意 给一个长度为n的字符串s,有q次询问,每次询问给出一个区间和一个字符串t,求区间中字典序最小的子串使得该子串的字典序大于t。 n≤105,q≤2∗105n≤105,q≤2∗105n\le10^5,q\le2*10^5。 分析 无聊模版题。 先预处理出sam上的right集线段树,枚举答案串和t的lcp长度,再枚举下一个字符是什么,然后直接在线段树上查找即可。 时间复杂度O(n...

beginend 879

后缀自动机(探索)Codeforces 427D

想学后缀自动机的 弱鸡 表示真自闭啊 开局一道题,内容全靠水 :Codeforces 427D 有题目才能更好地学 算法 题意很简单 :给两个字符串,求最短公共子串 的长度 后缀自动机 模板很多 ,给了各种写法 , 匡斌的版本 , 一个俄罗斯人的版本 , clj的版本 ,还有一种全数组(不用结构体)的版本 可真是太开心了(???我一个小白,到底哪个好理解??) ● 如果你是一个...

我歌月徘徊,我舞影零乱 347

codeforces 235 C Cyclical Quest (后缀自动机 SAM)

http://codeforces.com/problemset/problem/235/C 陈立杰出的后缀自动机,过的人挺少,不过还算是一道中规中矩的后缀自动机吧。 题目大意:给一个字符串S,再给一个字符串T,设T的长度为len,问T的循环串在S中出现的次数,这里循环串的定义是:对于一个长度为len的字符串,我们把它首尾相接,然后从任意位置开始走len步所得到的串我们叫做T的循环串。如aba

ddyyxx的程序员之路 8407
上一篇: [BZOJ1823][JSOI2010]满汉全席(2-SAT)
下一篇: [BZOJ1038][ZJOI2008]瞭望塔(半平面交)
FromATP
博客等级 码龄10年 75粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值