【构造】0517Binary String Sorting

news/2024/11/15 15:04:16/

Codeforces 1809D

题意:

构造一个长度为 n n n 的字符串 s s s ,均为小写字母。

给出 k k k 个要求,第 i 个要求为 x i , c i {x_i, c_i} xi,ci,表示对于 s [ 1 , x i ] s[1, x_i] s[1,xi] 这个前缀字符串,有恰好 c i c_i ci 个本质不同的回文子串。

数据范围:

  • 1 ≤ n ≤ 2 × 1 0 5 , 1 ≤ k ≤ 20 1\leq n\leq 2\times 10^5, 1\leq k\leq 20 1n2×105,1k20

  • 3 ≤ x 1 < x 2 < ⋯ < x k = n 3\leq x_1<x_2<\cdots<x_k=n 3x1<x2<<xk=n

  • 3 ≤ c 1 ≤ c 2 ≤ ⋯ ≤ c k ≤ min ⁡ 1 0 9 , ( n + 1 ) × n 2 3\leq c_1\leq c_2\leq \dots\leq c_k\leq \min{10^9,\frac{(n+1)\times n}{2}} 3c1c2ckmin109,2(n+1)×n

题解:

首先, k ≤ 20 k\leq 20 k20,而小写字母只有 26 个。

考虑每个前缀的回文子串的 min 和 max

  • n = 1, palindrome count: min = max = 1 (a)
  • n = 2, palindrome count: min = max = 2 (aa, ab)
  • n = 3, palindrome count: min = max = 3 (aaa, aab, abb, abc, aba)
  • n ≥ 4 n \geq 4 n4, palindrome count: min = 4, max = n

如何构造:

  • pa[i] 表示前缀中本质不同的回文子串数
  • s[1~3] = “abc”
  • 如果 pa[i + 1] == pa[i],则 s[i + 1] = ‘a/b/c’
  • 如果 pa[i] => pa[i + 1] => … => pa[j],pa[k] - pa[k - 1] == 1, k in (i, j],对于连续的段需要一个字符,故至多 k 个不同字符即可。

证明: p a [ i + 1 ] − p a [ i ] ≤ 1 pa[i + 1] - pa[i] \leq 1 pa[i+1]pa[i]1

如果 p a [ i + 1 ] − p a [ i ] > 1 pa[i + 1] - pa[i] > 1 pa[i+1]pa[i]>1,则说明:

  • 至少存在两个以 s[i + 1] 结尾的子串是回文串
  • s[i + 1] 在 s[1~i] 中出现过(如果未出现过,那么 pa[i + 1] = pa[i] + 1)

假设 j < k,且 s[j ~ i + 1] 和 s[k ~ i + 1] 都是回文串,因为 s[i + 1] 出现过,所以串长一定大于 1。

考虑 pos 为所有 s[i + 1] 这个字符在 s[1~i] 的位置,共有 npos 个。

故考虑的为:s[pos[1] ~ i + 1],s[pos[2] ~ i + 1], …, s[pos[npos] ~ i + 1] 是否为回文串且之前未出现过

这里有一个显然的想法是:如果 s[pos[x] ~ i + 1] 是回文串,则 s[pos[x] ~ pos[x + 1]] 和 s[pos[npos] ~ i + 1] 是一样的,要么都是回文串,要么都不是回文串,所以如果都是回文串的话,则这个回文串必然是在之前出现过,所以不会被计算在内,那么说明对于任意的以 s[i + 1] 结尾的回文串,至多只有一个是新的回文串。

p a [ i + 1 ] − p a [ i ] ≤ 1 pa[i + 1] - pa[i] \leq 1 pa[i+1]pa[i]1 得证。

故上述的对于 n ≥ 4 n \geq 4 n4, palindrome count: min = 4, max = n,也就可以构造得出了。

代码:

参考代码


http://www.ppmy.cn/news/84900.html

相关文章

C++ 项目实战:跨平台的文件与视频压缩解压工具的设计与实现

C++实战:跨平台文件与视频压缩解压工具的设计与实现 一、引言(Introduction)1.1 项目背景与目标1.2 技术选型:C++、FFmpeg、libarchive、libzip、QtC++FFmpeglibarchivelibzipQt二、设计思路与框架(Design Philosophy and Framework)2.1 设计思路:从需求到实现2.2 框架选…

图数据库实践 - 如何将图数据库应用于身份与访问管理

导读 目前&#xff0c;随着云计算和大数据的快速发展&#xff0c;身份与访问管理&#xff08;Identity and Access Management&#xff0c;IAM&#xff09;系统变得比以往任何时候都更加重要。因为涉密信息可能在几分钟内就被破解&#xff0c;网络犯罪分子仅需要一个员工账号&…

java spring MVC之RESTful快速开发

我这里有个一springboot项目 我在启动类同目录下创建了一个目录 目录名叫 controller 里面有一个UserController diam结构是这样的 package com.example.threshold.controller;import com.example.threshold.user; import org.springframework.stereotype.Controller; import…

【Flutter 工程】002-代码生成:Freezed ——类似 Java 的 lombok

【Flutter 工程】002-代码生成&#xff1a;Freezed ——类似 Java 的 lombok 文章目录 【Flutter 工程】002-代码生成&#xff1a;Freezed ——类似 Java 的 lombok一、概述1、简介2、主要功能3、主页与使用前后比较主页使用前使用后 二、基本使用1、安装2、改造 main.dart3、创…

言之画: AI绘画平台

【产品介绍】 言之画是出门问问推出的AI绘画平台。支持二次元、蒸汽朋克、插画等 8 种创作风格。用户只需输入文字&#xff0c;「言之画」就能一次性生成 8 张光影逼真、细节丰富的 2K 高分辨率图像。 除了以文生图&#xff0c;它还拥有以图生图、动图生成、个性头像生成等 AI …

有意思的CVE-2022-0337复现

前言 前两天在刷tw&#xff0c;看到了个比较有意思的一个CVE漏洞&#xff0c;价值奖励是10000美&#x1f52a;&#xff0c;比较好奇的是价值10000美&#x1f52a;的漏洞是什么样子的[苦涩]&#xff0c;漏洞利用就是需要在浏览器中进行用户交互才能触发该漏洞&#xff0c;但由于…

一文揭秘高效稳定的 Apache Doris 内存管理机制

作者&#xff1a;SelectDB 高级研发工程师、Apache Doris Committer 邹新一 背景 Apache Doris 作为基于 MPP 架构的 OLAP 数据库&#xff0c;数据从磁盘加载到内存后&#xff0c;会在算子间流式传递并计算&#xff0c;在内存中存储计算的中间结果&#xff0c;这种方式减少了频…

如何创建Vue实例?Vue实例有哪些属性和方法

Vue实例就是Vue的实例化对象&#xff0c;就像你有一个iPhone&#xff0c;那么iPhone就是你的实例化对象。要创建Vue实例&#xff0c;就像你想拥有一部iPhone一样&#xff0c;首先要有一个设计图。 这个设计图就相当于Vue实例的options对象&#xff0c;你可以设置它的属性&…