题解:P1393 Mivik 的标题

news/2025/11/13 21:27:22/文章来源:https://www.cnblogs.com/dyc2022/p/19219608

更差的阅读体验


这也太深刻了。

我们考虑一个 dp。我们假设 \(f_i\) 表示考虑前 \(i\) 个字符,\([i - |S| + 1: i]\) 这一段存在一个 \(S\) 的匹配,并且前 \(i\) 个字符不存在别的位置有 \(S\) 匹配的方案数。

那么我们就相当于确定了 \(S\) 第一次出现的位置,后面可以乱填,所以

\[\operatorname{answer} \cdot m^n = \sum\limits_{i = |S|}^{n}m^{n-i} \cdot f_i \]

接下来考虑怎么求这个 \(f\)。那么我们可以先求出总方案数,然后求出不合法的方案数。那么无非就是两种情况:

  • \(S\)\([1: i - |S|]\) 这一部分有出现。枚举第一次出现的位置就可以转移。
  • \(S\)\([1: i - |S|]\) 这一部分没有出现,但是存在一次和 \([i - |S| + 1: i]\) 这一段部分重合的匹配。那么需要满足重合部分的长度是 \(S\) 的一个 \(\operatorname{border}\)

\[f_{i} = \sum_{j = 0}^{i-|S|}f_j \cdot m^{i-|S|-j} + \sum_{j \in \operatorname{border}_i}f_{i-|S|+j} \]

直接做复杂度 \(O(n^2)\)

首先很显然地,第一部分可以前缀和来求。但是第二部分不太好优化。

如果你知道 Border Theory 的一点点东西的话,你就知道一个串 \(S\)\(\operatorname{border}\) 可以划分成 \(O(\log |S|)\) 个等差数列。这方面的内容可以去阅读这篇文章。

那么我们就会这个题目了。我们对每个等差数列分别统计答案,维护前缀和。具体地,假设公差为 \(d\),我们维护模 \(d\) 意义下的前缀和,也就是 \(s_{d, i} = s_{d, i-d} + f_i\)。然后我们枚举这些等差数列,一个一个把前缀和取出来计算就可以了。

然后这道题就做完了。假设 \(n, |S|\) 同阶,复杂度 \(O(n \log n)\)

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define N 200006
#define M 36
#define MOD 998244353
using namespace std;
int n,m,pw[N],len,tot,a[N],nxt[N];
int lb[M],rb[M],d[M],f[N],g[M][N];
int qpow(int x,int y=MOD-2)
{int ret=1;for(;y;y>>=1,x=x*x%MOD)if(y&1)ret=ret*x%MOD;return ret;
}
main()
{scanf("%lld%lld%lld",&n,&m,&len),pw[0]=1;for(int i=1;i<N;i++)pw[i]=pw[i-1]*m%MOD;for(int i=1;i<=len;i++)scanf("%lld",&a[i]);for(int i=2,j=0;i<=len;nxt[i]=j,i++){for(;a[j+1]!=a[i]&&j;j=nxt[j]);if(a[j+1]==a[i])j++;}for(int i=nxt[len];i;rb[tot]=len-i,i=nxt[i]){d[++tot]=i-nxt[i],lb[tot]=len-i;for(;nxt[i]&&i-nxt[i]==d[tot];i=nxt[i]);}f[len]=1;for(int i=1;i<=tot;i++)g[i][len]=1;for(int i=len+1,sum=0;i<=n;i++){sum=(sum*m+f[i-len])%MOD,f[i]=(pw[i-len]-sum+MOD)%MOD;for(int j=1;j<=tot;j++)f[i]=(f[i]-g[j][i-lb[j]]+g[j][max(0ll,i-rb[j]-d[j])]+MOD)%MOD;for(int j=1;j<=tot;j++)g[j][i]=(g[j][i-d[j]]+f[i])%MOD;}int ans=0;for(int i=len;i<=n;i++)ans+=f[i]*pw[n-i]%MOD,ans%=MOD;printf("%lld\n",ans*qpow(pw[n])%MOD);return 0;
}

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

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

相关文章

appium包含文本定位的5种方法

# appium定位,以text包含部分文字定位示例# 方法1: 使用XPath的contains函数进行text部分匹配 from appium.webdriver.common.appiumby import AppiumBydef locate_element_by_partial_text(driver, partial_text):&q…

C++ const总结

1、const 修饰普通变量 C/C++中常量用于记录程序中不可更改的数据,在数据类型前加const,就得到了一个不可更改的常量。常量声明:const用于定义常量const int MAX = 100;//MAX的值在程序运行期间无法被修改,所以必须…

11.13 程序员的修炼之道:从小工到专家 第五章 弯曲或折断 - GENGAR

这五节内容围绕软件设计的解耦、灵活性、协作效率展开,提出了多项关键原则与模型。解耦是贯穿始终的核心,得墨忒耳法则明确了对象方法调用的边界,仅允许调用自身、参数、创建对象及直接持有组件的方法,减少模块间依…

20251112周三日记

20251112周三日记今日: 1.早上九点多起床,下去登一下ow卡死进不去了。上课时接到家里消息。准备交简历、连梯子看3b1b教程。 2.下午看完了deepia老师的diffusion介绍,下载了本书,学了会儿,太他妈复杂了全是数学推…

力扣 第 475 场周赛(A~C)

力扣 第 475 场周赛(A~C)$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");A:3740. 三个相等元素之间的最小距离 I见B。 B:3741. 三个相等元素之间的最小距离…

学习笔记:AC 自动机

最智慧的,不是避免所有失败,而是在失配时借力转向,让每一次跌倒都成为新模式的起点。—— 题记其实我两周前就学了 AC 自动机,本来不应该现在才写这个笔记的。但是当时对 AC 自动机的理解比较模糊,直到刚才听了风…

详细介绍:Web爬虫指南

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

搜维尔科技:具身人工智能中的 MANUS:从人类运动到机器人灵巧性

灵巧的机器人手正成为具身人工智能的基石。动作捕捉、仿真、强化学习和自监督基础模型的最新进展,使得机器人能够执行越来越接近人类的操作技能。 复制人手的精确性、适应性和触觉控制能力(人手由27块骨头、数十块肌…

重组蛋白技术基础概述

重组蛋白的基本概念 重组蛋白是通过基因重组技术在宿主系统中表达的外源蛋白。该技术将目标基因导入表达载体,转化至宿主细胞,利用细胞自身的转录翻译机制合成目标蛋白。与传统组织提取相比,重组技术可获得更高纯度…

升鲜宝分拣系统 具体实现(一)

升鲜宝分拣系统 具体实现(一)按商品分拣1.商品汇总(分页)2.客户汇总(分页)3.分拣一条商品4.撤消一条已分拣商品5.缺货一条订单商品记录6.一条订单商品记录的操作记录7.获取分拣的商品分类8.获取分拣的线路列表9.分…

2025-11-13

1.Problem - 1881E - Codeforces(1500)(dp) dp好题 #include <bits/stdc++.h> using namespace std; #define LL long long const LL mod = 998244353; const int N=2e5+10; int a[N], inf = 1e9, dp[N];voi…

字典树小记

普通字典树 没什么好讲的 0-1 Trie 非常有用,经常用于异或相关的题目 求一个集合中两两异或的最大值 枚举集合中的一个数 \(x\),按位贪心,如果这一位有一个与 \(x\) 不同的,那么字典树上走这一边,否则走 \(x\) 的…

搜维尔科技:Xsens Link为精准而生,为创意而设计,为动作捕捉性能树立了新的标准

行业领先的动作捕捉服 新一代Xsens Link专为追求精准、可靠和行动自由的专业人士打造,这款全新的eSuit配备17个一键式传感器,内置线缆,安装时间缩短50%。Link经过重新设计,可提供最精准、最稳定的运动数据,树立了…

一个好题2

一个好题的题解题目传送门 欢迎光临我的博客 遇到这种题,我们首先有一个套路:拆贡献。我们把答案拆到每条边上,这样的话只需要加上 每条边在所有合法方案里出现的次数之和 \(\times\) 这条边的长度即可。 那一条边会…

实用指南:百分点科技发布中国首个AI原生GEO产品Generforce,助力品牌决胜AI搜索新时代

实用指南:百分点科技发布中国首个AI原生GEO产品Generforce,助力品牌决胜AI搜索新时代pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

考前复习

Floyd 字符串哈希 单调栈/单调队列 三分 ST 表 最小生成树 最近公共祖先(LCA) dij SPFA 缩点 tarjan(割点,割边,点双,边双,判环 ) 线段树,树状数组 欧拉路径 矩阵快速幂 全源最短路(Johnson) 两个排列的最长公…

2025 年 11 月粮库空调厂家最新推荐,聚焦资质、案例、售后的实力品牌深度解析!

在粮食储备行业,粮库空调的性能直接关系到粮食品质与存储安全,随着全球粮食储备技术升级,市场对高精度、高稳定性粮库空调的需求持续增长。本次 2025 年 11 月粮库空调厂家推荐,参考国际制冷协会(IIR)、国际粮食…

题解:P3813 [FJOI2017] 矩阵填数

更差的阅读体验注意到,一个矩阵最大值为 \(x\) 的充要条件是:矩阵中的每一个元素 \(\le x\)。 矩阵中存在至少一个 \(x\)。仅考虑第一个条件是好做的。具体地,每一个格子存在一个取值的上限 \(mx_{i, j}\),也就是所…

第三章博文

1.关于数学三角形这道题目,从图形来看,它拥有自上而下的的逻辑结构,根据观察,可以列出以下的递归方程式: 假设我们使用一个二维数组c的下半三角来存放整个数学三角形,用i来控制行(从1开始),用j来控制列,那么就…

Spring BeanPostProcessor接口

[[Spring IOC 源码学习总笔记]] BeanPostProcessor BeanPostProcessor是 Spring 框架提供的一个扩展点接口,它允许开发者在 Spring 容器完成 Bean 的实例化、依赖注入之后,在初始化阶段的前后“拦截”并自定义 Bean …