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

Codeforces Global Round 26 D. “a“ String Problem 【Z函数】

D. “a” String Problem

1

题意

给定一个字符串 s s s,要求把 s s s 拆分成若干段,满足以下要求:

  1. 拆分出来的每一个子段,要么是子串 t t t,要么是字符 a a a
  2. 子串 t t t 至少出现一次
  3. t ≠ " a " t \neq "a " t="a"

问有多少种不同的子串 t t t 满足以上要求

思路

如果 s s s 全是 a a a 的话,假设 ∣ s ∣ = n |s| = n s=n,那么答案是: n − 1 n - 1 n1

否则通过简单观察我们可以发现: t t t 必须包含 a a a 字符(不一定是所有,只要 t t t 可以覆盖这些非 a a a 字符即可)

假设 s s s 从左到右第一个出现非 a a a 字符的位置是 p 0 p_0 p0,如果我们先固定 t t t 的开头在 p 0 p_0 p0
我们就可以先枚举 t t t 的长度从 1 → n − p 0 + 1 1 \rarr n - p_0 + 1 1np0+1,那么如何确定当前 t t t 是否满足上述要求?

我们直接在第一个 t t t末尾后面,找第一个出现的非 a a a 字符作为第二个 t t t 的开头,然后这后面 l e n len len 个字符必须与 t t t 相等,如果相等则继续往后检查,否则当前 t t t 无效。

我们只需要预处理每一个位置后面第一个非 a a a 字符的位置就可以,倒着扫一遍就可以线性预处理出来。
匹配的过程我们可以使用 Z Z \; Z函数,这是由于本质上是从 p 0 p_0 p0 开始的字符串,拿它去和它自己本身的每个后缀做匹配,自然可以使用 Z Z \; Z 函数。
那么这个检查过程是: O ( n log ⁡ n ) O(n \log n) O(nlogn) 的(调和级数复杂度)

那么现在问题在于: t t t 不一定是以非 a a a 字符开头的。
其实这个问题很容易处理,假设我们当前有效的从 p 0 p_0 p0 开头的 ∣ t ∣ = l e n |t| = len t=len,那么我们在检查过程的同时,记录每个 t t t 的前面到前一个 t t t 的末尾,有多少个 a a a,统计这个最小值 m n mn mn
那么很显然,当前的 t t t 可以往前扩展最多 m n mn mn a a a,最后还是有效的。
那么这里的方案数就是: m n + 1 mn + 1 mn+1

所以答案最后对于每个有效长度累加即可

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n' 
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()const int INF=0x3f3f3f3f;
const long long INFLL=0x3f3f3f3f3f3f3f3fLL;typedef long long ll;std::vector<int> z_function(const std::string& s, int n){std::vector<int> z(n + 1, 0);z[1] = n;int l = 0, r = 0;fore(i, 2, n + 1){if(i <= r)	z[i] = std::min(z[i - l + 1], r - i + 1);while(i + z[i] <= n && s[1 + z[i]] == s[i + z[i]])++z[i];if(i + z[i] - 1 > r){l = i;r = i + z[i] - 1;}}return z;
}int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int t;std::cin >> t;while(t--){std::string s;std::cin >> s;int n = s.size();s = '0' + s;std::vector<int> nxt_nona(n + 5, n + 5);for(int i = n; i > 0; --i){if(s[i] == 'a') nxt_nona[i] = nxt_nona[i + 1];else nxt_nona[i] = i;}if(nxt_nona[1] > n){ //全是astd::cout << n - 1 << endl;continue;}int p0 = nxt_nona[1];std::string T = s.substr(p0);T = '0' + T;auto z = z_function(T, T.size() - 1);ll ans = 0;fore(len, 1, n - p0 + 2){int mn = p0 - 1;bool ok = true;int lst = p0 + len - 1;for(int j = nxt_nona[p0 + len]; j <= n; j = nxt_nona[j + len]){if(z[j - p0 + 1] < len){ok = false;break;}mn = std::min(mn, j - lst - 1);lst = j + len - 1;}if(ok)	ans += mn + 1;}std::cout << ans << endl;}return 0; 
}

相关文章:

Codeforces Global Round 26 D. “a“ String Problem 【Z函数】

D. “a” String Problem 题意 给定一个字符串 s s s&#xff0c;要求把 s s s 拆分成若干段&#xff0c;满足以下要求&#xff1a; 拆分出来的每一个子段&#xff0c;要么是子串 t t t&#xff0c;要么是字符 a a a子串 t t t 至少出现一次 t ≠ " a " t \ne…...

Next.js 加载页面及流式渲染(Streaming)

Next.js 加载页面及流式渲染&#xff08;Streaming&#xff09; 在现代的 Web 应用开发中&#xff0c;用户体验是至关重要的。快速响应的页面加载和流畅的用户界面可以显著提升用户的满意度。而加载页面&#xff08;Loading Page&#xff09;和流式渲染&#xff08;Streaming&…...

形如SyntaxError: EOL while scanning string literal,以红色波浪线形式在Pycharm下出现

背景&#xff1a; 新手在学习Python时可能会出现如下图所示的报错 下面分情况教大家如何解决 视频教程【推荐】&#xff1a; 形如SyntaxError: EOL while scanning string literal&#xff0c;以红色波浪线形式在Pycharm下出现 过程&#xff1a; 问题概述&#xff1a; 简单…...

DockerCompose+Jenkins+Pipeline流水线打包SpringBoot项目(解压安装配置JDK、Maven等)入门

场景 DockerCompose中部署Jenkins&#xff08;Docker Desktop在windows上数据卷映射&#xff09;&#xff1a; DockerCompose中部署Jenkins&#xff08;Docker Desktop在windows上数据卷映射&#xff09;-CSDN博客 DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代…...

Web前端开发个人技能全面剖析:四维度深度理解,五能力实战展现,六要素构建优势,七步骤持续精进

Web前端开发个人技能全面剖析&#xff1a;四维度深度理解&#xff0c;五能力实战展现&#xff0c;六要素构建优势&#xff0c;七步骤持续精进 在数字化浪潮的推动下&#xff0c;Web前端开发成为了互联网行业中的热门岗位&#xff0c;对个人的技能要求也越来越高。本文将从四个…...

如何让 uboot启动时自动执行指令?(执行“mtdparts default”命令)

让uboot启动时自动设置分区&#xff08;执行“mtdparts default”命令&#xff09;&#xff0c;在uboot进入main_loop()死循环之前添加执行命令代码 run_command("mtdparts default", 0); #define MTDIDS_DEFAULT "nand0mini2440-nand" #define MTD…...

Java的集合框架总结

Map接口和Collection接口是所有集合框架的父接口&#xff1a; Collection接口的子接口包括&#xff1a;Set接口和List接口 Map接口的实现类主要有&#xff1a;HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有&#xff1a;HashSet、Tr…...

基于DenseNet网络实现Cifar-10数据集分类

目录 1.作者介绍2.Cifar-10数据集介绍3.Densenet网络模型3.1网络背景3.2网络结构3.2.1Dense Block3.2.2Bottleneck层3.2.3Transition层3.2.4压缩 4.代码实现4.1数据加载4.2建立 DenseNet 网络模型4.3模型训练4.4训练代码4.5测试代码 参考链接 1.作者介绍 吴思雨&#xff0c;女…...

我的“工具”库

#使用到的工具# { 网页版的VScode&#xff1a; www.vscode.dev} {网页版JSON文件编辑器&#xff1a; JSON Editor Online: edit JSON, format JSON, query JSON &#xff5d; {网页版XML文件编辑器: Best Online XML Viewer, XML Formatter, XML Editor, Analyser, Be…...

Pytorch常用函数用法归纳:Tensor张量之间的计算

1.torch.add() (1)函数原型: torch.add(input, other, alpha, out) (2)参数说明: 参数名称参数类型参数说明inputtorch.Tensor表示参与运算的第一个输入Tensor张量othertorch.Tensor或者Number表示参与运算的第二个输入Tensor张量或标量alphaNumber, optional一个可选的缩放…...

小公司要求真高

大家好&#xff0c;我是白露啊。 最近看到一个爽文帖&#xff0c;标题就是——“小公司要求真高”。 事情是这样的&#xff0c;一家的小公司在拿到简历之后&#xff0c;HR直接对楼主说&#xff1a;“你不合适&#xff0c;简历不行。” 言外之意就是嫌弃简历单薄&#xff0c;看…...

进阶篇02——索引

概述 结构 B树索引 在这里推荐一个可以将个各种数据结构可视化的网站&#xff1a;数据结构可视化 哈希索引 相关的一个面试题 分类 聚集索引和二级索引&#xff08;非聚集索引&#xff09; 思考题&#xff1a;索引思考题 创建索引语法 如果一个索引关联多个字段&#xff…...

三:SpringBoot的helloworld和使用Springboot的优点以及快速创建Springboot应用

三&#xff1a;SpringBoot的helloworld和使用Springboot的优点以及快速创建Springboot应用 一&#xff1a;HelloWorld [我们创建的是maven项目或者直接创建一个Spring] 1.1&#xff1a;创建一个maven 项目&#xff08;1】&#xff1a;需要自己手动写一个SpringBoot 的启动类同…...

网络仿真方法综述

目录 1. 引言 2.仿真器介绍 2.1 NS-2 2.2 NS-3 2.3 OPNET 2.4 GNS3 3.仿真对比 4.结论 参考文献 1. 引言 网络仿真是指使用计算机模拟网络系统的行为和性能的过程。在网络仿真中&#xff0c;可以建立一个虚拟的网络环境&#xff0c;并通过模拟各种网络设备、协议和应用程…...

Android-Q升级-Camera记录

目录 代码环境 建立Android Q使用的camera仓 Camera底层适配 camx 原生接口变化 其他编译问题 chi-cdk 数据类型不匹配 case未加break的报错 libalRnBRT_GL_GBWRAPPER链接问题 vidhance编译错误 libarcsat链接问题 vendor/qcom/proprietary prebuilt_HY11 调试cam…...

Android studio如何导入项目

打开解压好的安装包 找到build.gradle文件 打开查看gradle版本 下载对应的gradle版本Index of /gradle/&#xff08;镜像网站&#xff09; 下载all的对应压缩包 配置gradle的环境变量 新建GRADLE_HOME 将GRADLE_HOME加入到path中 将项目在Android studio中打开进行配置 将gr…...

PHP实现一个简单的接口签名方法以及思路分析

文章目录 签名生成说明签名生成示例代码签名校验示例代码 签名生成说明 B项目需要调用A项目的接口&#xff0c;由A项目为B项目分配 AccessKey 和 SecretKey&#xff0c;用于接口加密&#xff0c;确保不易被穷举&#xff0c;生成算法不易被猜测。 最终需要确保包含签名的参数只…...

StartAI”梦想合伙人 ”招募计划

我们正火热招募AI设计师产品合伙人&#xff01;如果你对AI技术充满好奇&#xff0c;对设计有着独特的见解和热情&#xff0c;亦或者你想在日常的设计工作中提高效率&#xff0c;无论你是电商设计师、UI设计师、建筑师、插画师等其他各类设计领域的人才。那么这就是你不容错过的…...

记录:podman安装redis

Linux系统上安装redis&#xff1a; podman pull redis # 拉取最新的redis版本 podman images # 查看所有本地的镜像&#xff0c;包括刚拉取的redis镜像mkdir -p /etc/redis/conf /etc/redis/data # 创建2个目录文件&#xff0c;保存redis的数据和配置文件 tou…...

TrinityCore启动报错: MySQL library version (8.0.37 id 80037) does not match

TrinityCore启动的时候报错&#xff1a; TrinityCore/src/server/database/Database/DatabaseWorkerPool.cpp:73 in DatabaseWorkerPool FATAL ERROR: Used MySQL library version (8.0.37 id 80037) does not match the version id used to compile TrinityCore (id 80036). S…...

ubuntu20.04设置开机自动登录适用与GNOME桌面环境

默认arm版本ubuntu20.04未安装nano编辑器&#xff0c;so我们要安装一下&#xff0c; sudo apt update && sudo apt install nano设置方法&#xff1a; sudo nano /etc/gdm3/custom.conf添加或修改&#xff0c;用户名区分大小写。 AutomaticLoginEnableTrue AutomaticLo…...

2024网安保研上岸图鉴:从211边缘到清北直博的破局之路

1. 边缘人的逆袭起点&#xff1a;认清定位比盲目努力更重要 作为西北某211计算机大类边缘专业的学生&#xff0c;我的起点可以说毫无优势。专业名称听着像计算机&#xff0c;实际课程设置却偏向传统工科&#xff1b;学院往届最优秀的学长也只止步华五&#xff1b;我的编程能力在…...

Python代码秒变Linux原生二进制:手把手带你用2026最新toolchain完成AOT编译(含交叉编译Windows/Mac/LoongArch三平台完整脚本)

第一章&#xff1a;Python代码秒变Linux原生二进制&#xff1a;手把手带你用2026最新toolchain完成AOT编译&#xff08;含交叉编译Windows/Mac/LoongArch三平台完整脚本&#xff09; Python长期受限于CPython解释器与GIL&#xff0c;难以直接生成真正独立、零依赖的原生可执行文…...

这家口腔机构,如何用AI把到院成本从1200+打到310元?

广东有一家口腔机构&#xff0c;三级专科&#xff0c;种植体量在区域排前三。 听起来很牛吧&#xff1f;但老板跟我聊天的时候&#xff0c;愁得不行。他说&#xff0c;抖音投放成本飘高&#xff0c;线索到院率低&#xff0c;客服人手不足&#xff0c;加微后无差别群发&#xff…...

SUPER COLORIZER社区贡献指南:如何参与模型改进与工具开发

SUPER COLORIZER社区贡献指南&#xff1a;如何参与模型改进与工具开发 想为AI图像上色项目添砖加瓦&#xff0c;却不知从何下手&#xff1f;看着开源社区里活跃的讨论和不断迭代的代码&#xff0c;你是否也跃跃欲试&#xff1f;别担心&#xff0c;贡献开源项目并没有想象中那么…...

终极指南:Navicat Premium Mac版无限试用重置的完整解决方案

终极指南&#xff1a;Navicat Premium Mac版无限试用重置的完整解决方案 【免费下载链接】navicat_reset_mac navicat16 mac版无限重置试用期脚本 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还在为Navicat Premium试用期到期而烦恼吗&#xff1f;…...

OpenClaw+ollama-QwQ-32B自动化写作:从指令到公众号草稿全流程

OpenClawollama-QwQ-32B自动化写作&#xff1a;从指令到公众号草稿全流程 1. 为什么需要自动化写作助手 作为一个技术博主&#xff0c;我每周都要产出2-3篇原创文章。最痛苦的环节不是写作本身&#xff0c;而是那些重复性的准备工作&#xff1a;收集资料、整理格式、调整排版…...

零配置部署!VoxCPM-1.5-WEBUI让语音合成变得像上网一样简单

零配置部署&#xff01;VoxCPM-1.5-WEBUI让语音合成变得像上网一样简单 你是否曾为视频配音找不到合适的声音而烦恼&#xff1f;是否想过制作有声读物却苦于录音设备和时间成本&#xff1f;或者&#xff0c;你只是想体验一下&#xff0c;让AI用你喜欢的音色为你朗读一段文字&a…...

cv_resnet50_face-reconstruction效果对比:不同光照/姿态下人脸重建质量实测报告

cv_resnet50_face-reconstruction效果对比&#xff1a;不同光照/姿态下人脸重建质量实测报告 你是不是也好奇&#xff0c;一个基于ResNet50的人脸重建模型&#xff0c;到底能把一张照片还原到什么程度&#xff1f;它能不能处理好那些光线不好、角度刁钻的照片&#xff1f;今天…...

PyFluent:3大核心场景实现CFD仿真全流程自动化

PyFluent&#xff1a;3大核心场景实现CFD仿真全流程自动化 【免费下载链接】pyfluent 项目地址: https://gitcode.com/gh_mirrors/pyf/pyfluent 计算流体动力学&#xff08;CFD&#xff09;仿真作为工程设计的关键环节&#xff0c;长期面临流程繁琐、迭代低效、跨学科协…...