先辈题解

news/2025/10/14 20:16:47/文章来源:https://www.cnblogs.com/why20031113/p/19141926

首先我们先观察到 $ 114514 $ 中只有三种数,$ 1 \(,\) 4 \(,\) 5 $,这给了我们一个思路,直接枚举这三个数代表的字母是什么,字母共有 $ 26 $ 种,所以我们的复杂度是 $ O(26^3n) $的。

code:

void dfs(int s1,int s2,int s3){int len1=0,len2=0,len3=0,len4=0,len5=0,len6=0;for(int i=1;i<=n;i++){if(a[i]==s1) len5=(len5+len4)%mod,len2=(len2+len1)%mod,len1=(len1+1)%mod;if(a[i]==s2) len6=(len6+len5)%mod,len3=(len3+len2)%mod;if(a[i]==s3) len4=(len4+len3)%mod;}ans=(ans+len6)%mod;return;
}
for(int i=1;i<=26;i++)
{for(int j=1;j<=26;j++){if(j==i) continue;for(int k=1;k<=26;k++){if(k==j||k==i) continue;dfs(i,j,k);}}
}

注:dfs中要倒着加

这样我们就拿到了 $ 60 $ 分,考虑怎么优化。

我们观察到在dfs中我们转移时只用上了 $ s1,s2,s3 $ ,所以我们可以开个vector来记录每一个字母的出现位置,然后直接跳三个字母的离当前最近的那个。

code:

void dfs(int s1,int s2,int s3){int len1=0,len2=0,len3=0,len4=0,len5=0,len6=0;int id1=0,id2=0,id3=0;for(int i=min({q[s1][id1],q[s2][id2],q[s3][id3]});i<=n;i=min({q[s1][id1],q[s2][id2],q[s3][id3]})){if(a[i]==s1) len5=(len5+len4)%mod,len2=(len2+len1)%mod,len1=(len1+1)%mod,id1++;if(a[i]==s2) len6=(len6+len5)%mod,len3=(len3+len2)%mod,id2++;if(a[i]==s3) len4=(len4+len3)%mod,id3++;}ans=(ans+len6)%mod;return;
}
for(int i=1;i<=n;i++)
{a[i]=s[i]-'a'+1,up=max(up,a[i]);q[a[i]].push_back(i);
}
for(int i=1;i<=26;i++) q[i].push_back(n+1);
for(int i=1;i<=up;i++)
{for(int j=1;j<=up;j++){if(j==i) continue;for(int k=1;k<=up;k++){if(k==j||k==i) continue;dfs(i,j,k);}}
}

这样我们还是 $ 60 $ 分,这个已经没什么好方法优化了,我们接着从 $ 114514 $ 上下手。

观察到 $ 1 $ 出现了 $ 3 $ 次, $ 4 $ 出现了 $ 2 $ 次,而 $ 5 $ 只出现了 $ 1 $ 次。

我们尝试少枚举一个字母,容易发现,我们一定要枚举 $ 1 $ 代表的字符,因为它出现 $ 3 $ 次,若不枚举它不好搞,$ 4 $ 也同理,但是 $ 5 $ 只出现了一次,我们不用考虑它和前边的某个数相同,只要它和另两个不同就行,其他的都没有影响。这样,我们把这个方法优化到了 $ O(26^2n) $,看起来很可过了。

code:

constepxr int mod=114514; 
#define add(x,y) x=(x+y)%mod
void dfs(int s1,int s2){int len1=0,len2=0,len3=0,len4=0,len5=0,len6=0;for(int i=1;i<=n;i++){if(a[i]==s1) add(len5,len4),add(len2,len1),add(len1,1);else if(a[i]==s2) add(len6,len5),add(len3,len2);else add(len4,len3);}add(ans,len6);
}
for(int i=1;i<=n;i++) a[i]=s[i]-'a'+1,up=max(up,a[i]);
for(int i=1;i<=up;i++)
{for(int j=1;j<=up;j++){if(j==i) continue;dfs(i,j);}
}

等我们交上去一看,很不幸T了,为什么呢?因为取模太慢了。只要把

#define add(x,y) x=(x+y)%mod

改成

#define add(x,y) x+=y,x=x>=mod?x-mod:x

就好了。

完整代码 :

#include<bits/stdc++.h>
using namespace std;
constexpr int N=5e5+10,mod=114514;
char s[N];
int a[N],ans,n,up,siz[27];
inline int in(){int k=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9') k=(k<<3)+(k<<1)+c-'0',c=getchar();  return k*f;
}
#define add(x,y) x+=y,x=x>=mod?x-mod:x
void dfs(int s1,int s2){int len1=0,len2=0,len3=0,len4=0,len5=0,len6=0;for(int i=1;i<=n;i++){if(a[i]==s1) add(len5,len4),add(len2,len1),add(len1,1);else if(a[i]==s2) add(len6,len5),add(len3,len2);else add(len4,len3);}add(ans,len6);
}
signed main(){// freopen("ex_anc3.in","r",stdin);freopen("1.out","w",stdout);// freopen("1.in","r",stdin);freopen("1.out","w",stdout);freopen("anc.in","r",stdin);freopen("anc.out","w",stdout);scanf("%s",(s+1));n=strlen(s+1);for(int i=1;i<=n;i++) a[i]=s[i]-'a'+1,up=max(up,a[i]);for(int i=1;i<=up;i++){for(int j=1;j<=up;j++){if(j==i) continue;dfs(i,j);}}printf("%d\n",ans);return 0;
}
///////////////////////////////////////////////////
//                      ♪♪♪                      //
///////////////////////////////////////////////////
//つ ◕_◕ つ
//༼ つ ◕_◕ ༽つ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:并发编程原理与实战(三十三)AQS框架下手写简易可重入锁的实战解析

详细介绍:并发编程原理与实战(三十三)AQS框架下手写简易可重入锁的实战解析2025-10-14 20:13 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow…

U-Boot启动探秘:从汇编到命令行的奇幻之旅 - 指南

U-Boot启动探秘:从汇编到命令行的奇幻之旅 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

实用指南:【Lsky-Pro开源图床】Lsky-Pro+cpolar:云端素材库的远程协作方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

双指针的初步了解

双引用的初步了解 10.14今天在力扣上刷题,第一次了解到了双引用的概念,如图对于这个题,我一开始的思路是从0到size-1一步步遍历,如果找到值为val的,就删去,然后让计数器加1,最后输出计数器。但是不知道为什么总…

倍增并查集学习笔记

学完板子即可开始水紫题倍增并查集,可以在 \(O(m log^2 n)\) 的时间复杂度内求解 \(m\) 个诸如此类的合并问题: \[\forall \,\,\,\,\, 0 \leq i \leq k \, , \, merge(x+i,y+i) \]就真的是倍增和并查集的结合体,而不…

两数相加-leetcode

题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外…

CF2147E

给定 \(n\) 个数和 \(q\) 次查询,每次查询给定 \(k\),问最多进行 \(k\) 次以下操作后 \(n\) 个数按位或的 popcount 最大值。 令 \(ans_i\) 表示使得 \(popcount \ge i\) 至少需要几次操作,显然 \(ans_i\) 单调不降…

线程共享区域

线程共享区域🔴 线程共享区域 (Thread-Shared Areas) #JVM/线程共享区域 🔴 特点:所有线程共享同一个内存区域,需要考虑线程安全问题,是垃圾回收的主要工作区域 🔴 1. Java堆 (Java Heap) #JVM/Java堆 🔴 定…

ZR 2025 NOIP 二十连测 #1

100 + 0 + 30 + 0 = 130, Rank 72/133.大模拟!/tuu25noip二十连测day1 链接:link 题解:题目内 时间:4.5h (2025.10.14 07:40~12:10) 题目数:4 难度:A B C D\(\color{#F39C11} 橙\)*1200估分:100 + 0 + 30 + 0 =…

work1

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业要求在哪里:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13558 学号:102500331 姓名:余武 安装过程:安装成功:代码结果:

2025 年液压机厂家推荐榜:伺服/小型/大型/数控/液压机厂家口碑推荐,品质可靠 聚焦智能适配,助力企业高效生产

随着制造业智能化升级、产品精度要求提升及生产效率优化需求增加,液压机作为关键成型设备,已从传统重工业领域逐步延伸至汽车零部件、五金制品、粉末冶金、电子元件等多个细分行业,2025 年市场规模预计持续扩大。但…

快速上手!山海鲸 4 种高频数据接入方式

在数据可视化实践中,“数据能顺畅接入” 是大屏发挥价值的前提。山海鲸数据可视化大屏针对不同业务场景与数据形态,推出了 4 种高频使用的数据接入方式,既降低了技术门槛,又保障了数据对接的稳定性与时效性,以下为…

AI4S Cup学习赛 - 超导体临界温度预测

AI4S Cup学习赛 - 超导体临界温度预测https://www.bohrium.com/competitions/3521345283?tab=mine

2025高级语言程序设计第一次作业lcr

班级链接:https://edu.cnblogs.com/campus/fzu/gjyycx 作业要求链接:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13558 我的学号:102500417 我的名字:刘朝榕 1.安装dev-c++2.成功安装好dev-c++3.编写示例…

D230809E. 勇敢的阿乐

题意: 一个 包含 \(n\) 个点 \(m\) 条边的简单无向连通图。现在,删掉其中的一些边让度数为奇数的点尽可能多。 输出要删掉哪些边, 用一个长为 \(m\) 的 01串 表示, 第 \(i\) 位为 \(1\) 表示不删第 \(i\) 条边, 为 \…

完整教程:面向.NET开发者:Prosys OPC UA .NET SDK 全面解析

完整教程:面向.NET开发者:Prosys OPC UA .NET SDK 全面解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

分布式秒杀系统设计方案 - 实践

分布式秒杀系统设计方案 - 实践2025-10-14 19:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

高级程序语言第一次作业

这个作业属于哪个课程:高级语言程序设计 这个作业要求在哪里:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13558 学号:102500434 姓名:王志勇 一:dev-c++的安装:注意设置相关要求,安装正常。二:代码的…

安装devc++过程的分享以及问题的记录

课程:https://edu.cnblogs.com/campus/fzu/gjyycx 作业要求 https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13558 学号:102500330 姓名:黄明浩1.解压压缩文件,进行的还算顺利,将程序存放到了一个全英文目录…

Linux之线程池 - 指南

Linux之线程池 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…