当前位置: 首页 > news >正文

33 ACwing 294 Count The Repetitions 题解

Count The Repetitions

题面

定义 conn(s,n) 为 n 个字符串 s 首尾相接形成的字符串,例如:

conn(“abc”,2)=”abcabc”

称字符串 a 能由字符串 b 生成,当且仅当 a 为 b 的子序列。

例如 abdbec 可以生成 abc,但是 acbbe 不能生成 abc

给定两个字符串 s1 和 s2,以及两个整数 n1 和 n2,求一个最大的整数 m,满足 conn(conn(s2,n2),m) 能由 conn(s1,n1) 生成。

s1 和 s2 长度不超过 100,n1 和 n2 不大于 \(10 ^ 6\)

题解

我们可以转化一下,实际上就是要求一个最大的 \(m'\) 使得 \(conn(s_2, m_2)\) 能由 \(conn(s_1,n_1)\) 生成

暴力枚举的话,就是将 \(conn (s_1,n_1)\) 枚举一遍,能匹配上就匹配,时间复杂度为 \(O(T|s_1|n_1)\)

\(m'\) 可能很大,上界为 \(|s_1|n_1/|s_2|\) ,考虑将 \(m'\) 进行二进制拆分,那么我们可以将 \(conn(s_2,m')\) 看做若干个 \(conn(s_2,2^x)\) 相连的形式

我们可以求出 \(k \in [0,\log_2(|s_1|n1 / |s_2|)]\) ,从 \(conn(s_1,n_1)\) 的每个位置开始最少多长的字符串能拼出 \(2^k\)\(s_2\)

但是 \(n_1\) 也非常大,不过因为 \(conn(s_1,n_1)\) 是由 \(s_1\) 重复 \(n_1\) 次得到的,所以只要没有到结尾,从 \(s_1[i]\) 开始和从 \(s_1[i + k|s_1|]\) 开始往后的字符是一样的,所以我们可以假设 \(n_1\) 无限大,然后只计算 \(i \le |s_1|\) 的从 \(s_1[i]\) 开始的位置即可

\(f(i,j)\) 表示从 \(s_1[i]\) 开始匹配到 \(2^j\)\(s_1\) 最短需要多少个字符,我们只需预处理出 \(f(i,0)\) 即可,后面的可以递推得出

预处理 \(f(i,0)\) 暴力匹配即可,时间复杂度为 \(O(100^3)\)

code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>using namespace std;typedef long long ll;const int N = 110;int n1, n2;
char s1[N], s2[N];
ll f[N][32];void solve () {int sz = strlen (s1);//预处理 f[i][0]for (int i = 0; i < sz; i ++) {f[i][0] = 0;int p = i;for (int j = 0; j < (int)strlen (s2); j ++) {int cnt = 0;while (s1[p] != s2[j]) {p = (p + 1) % sz;cnt ++;if (cnt >= sz) {cout << 0 << endl;return;}}p = (p + 1) % sz;f[i][0] += cnt + 1;}}//计算出 f[i][j]for (int j = 1; j <= 30; j ++) {for (int i = 0; i < sz; i ++) {f[i][j] = f[i][j - 1] + f[(i + f[i][j - 1]) % sz][j - 1];}}//计算答案ll res = 0, p = 0, t = 0;for (int j = 30; j >= 0; j --) {if (p + f[p % sz][j] <= n1 * sz) {p += f[p % sz][j];t += (1 << j);}}res = max (res, t);cout << res / n2 << endl;
}int main () {while (~scanf ("%s%d%s%d", s2, &n2, s1, &n1)) {solve ();}return 0;
}
http://www.zskr.cn/news/16215.html

相关文章:

  • 11 ACwing 281 Coins 题解
  • 4 ACwing 274 Mobile Service 题解
  • 2 ACwing 272 LCIS 最长公共上升子序列 题解
  • 用 Haxe 实现英文数字验证码识别
  • 差分约束模板
  • QOJ7411 Bitwise Xor
  • 完整教程:SOC-ESP32S3部分:25-HTTP请求
  • 第一次使用Ttpora
  • NKOJ全TJ计划——NP11744
  • ROIR 2025
  • python编写AI生常用匡架及使用指令集
  • 123123
  • 2025.10.5 2024CCPC郑州
  • 20250531MATLAB三维绘图 - 教程
  • 概率期望dp 复习笔记
  • 完整教程:爬虫--以爬取小说为例
  • 仅需3%训练数据的文本归一化技术
  • 完整教程:56、Ocelot 概述
  • 【音视频】FFmpeg 编码H265 - 实践
  • Windows系统安装MySQL Connector 利用C++ VS2022连接MySQL
  • C/C++与Java、Python、Go在各个阶段的区别
  • [省选联考 2025] 图排列 题解
  • 实用指南:UV 包管理工具:替代 pip 的现代化解决方案
  • 2025焚烧炉厂家权威推荐,技术实力与市场口碑深度解析
  • 从价值博弈到价值原语博弈的跃迁:降维解析与升维求解的工程实现——声明Ai研究
  • 2025电缆厂家最新推荐排行榜:深度解析青岛一缆等六家优质企业实力,助力精准选购
  • 1 洛谷题解修正器
  • 防止语言模型性能倒退的新方法
  • 2025 年电永磁吊具制造厂家 TOP 企业品牌推荐排行榜全新发布,含大型电永磁吊具,全覆盖,起重,小型,钢板,钢板电永磁吊具公司推荐!