当前位置: 首页 > 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…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...