首页 > 其他分享 >列序号括(bracket)

列序号括(bracket)

时间:2024-09-25 20:04:48浏览次数:10  
标签:log 删除 括号 bracket 序列 哈希 序号 字典

列序号括(bracket)

题面在比赛下发文件里。给你一个括号序列,你可以删除 \(i,j\) 当 \(i<j\) 且 \(s_i=\)(,\(s_j=\))。问可以形成的字典序最小的括号序列是什么。

首先我们要有一点贪心地考虑什么时候我们才会删除一对括号。如果我们要删除的一对括号中间有东西没有被删除,若中间有 ),则这个操作是不优的;若中间全部都是 (,则这个操作可以看做是删除了最右边的那个 ()

因此,删除一对括号满足它们中间是空的。所以我们可以一对一对删,每次比较删前和删后的字典序。但是显然这样时间很大,一共会删除 \(O(n)\) 对括号,每次枚举 \(O(n)\),比较 \(O(n)\),一共 \(O(n^3)\)。比较如果用二分哈希优化一下,可以做到 \(o(n^2\log n)\),这里不展开。

我们每次要枚举删除哪对括号,主要是可能有这种情况 ((()())),你要删完中间再删左边(位置取左括号位置),我们要把 \(O(n^2)\) 优化成 \(o(n)\),就必须钦定一个删除括号的顺序。因为是字典序,所以我们考虑从后往前删,因为后面的删除会影响前面是否删除。容易发现删除的一定是一个连续的合法的括号序列。设 \(f_i\) 表示考虑到 \(i\) (从后往前)的最小括号序列。转移分 \(i\) 删或者不删转移。如果 \(s_i=\)) 显然它左边目前没有可以和它配对的,它只能不删,否则如果不删,\(f_i\gets s_i+f_{i+1}\),如果它要删掉,则以它开头的最短合法括号序列一定会被删掉,记这个最短合法括号序列的右端点为 \(ne_i\),有 \(f_i\gets f_{ne_i+1}\)。

预处理每个位置开头最短合法括号序列,可以从左往右扫,( 当做 \(+1\),) 当做 \(-1\),维护一个永远不小于 \(0\) 的前缀和 \(A\),因为 ) 多了是配不了对的,直接清零。然后 \(ne_i\) 就是第一个满足 \(a_j=a_i-1\) 的位置。

DP 状态数是 \(O(n)\) 的了,但是比较两个字符串字典序大小是 \(O(n)\) 的。这里不好哈希,因为你不能每个后缀的答案都维护哈希前缀值,空间就爆了,更新哈希值时间也爆。考虑倍增。每个后缀的答案维护 \(\log\) 个哈希值,转移是 \(O(\log)\) 的。除了哈希的倍增数组,还要维护答案的 \(\log\) 个位置的倍增数组,毕竟无论是更新哈希还是比较字典序,你都要知道跳 \(2^k\) 步之后会到达哪里,这个也是好维护的。

总时间复杂度 \(n\log n\)。

my AC code.写得十分 shit 请见谅

标签:log,删除,括号,bracket,序列,哈希,序号,字典
From: https://www.cnblogs.com/liyixin0514/p/18432061

相关文章

  • Latex-参考文献引用序号缩减 [a-b]
    使用Latex在论文正文中引用文献,如果文献数量太多,逐篇列举会非常占篇幅,并且使文章看起来冗杂。如下所示:  这里可以通过Latex{natbib}包中的[sort&compress]选项来实现文献引用序号的缩减,即  \usepackage[numbers,sort&compress]{natbib} 。该包引用语句加在  \be......
  • [oeasy]python035_根据序号得到字符_chr函数_字符_character_
    字符(character)回忆上次内容上次了解了ord函数ord的意思是ordinal(序号)ord函数可以根据字符得到序号那么可以反过来吗?根据序号得到字符可以吗?......
  • leetcode 算法题目学习笔记 - 序号2
    2.两数相加给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。可用的模板#include<iostream>#in......
  • leetcode 算法题目学习笔记 - 序号1
    1.两数之和https://leetcode.cn/problems/two-sum/简要说明:1.给定一个数组和一个数字2.要求找到数组中某两个元素,使得他们相加等于所给数字(将所给数字拆为数组中的某两个个元素)3.以数组形式返回两个下标否则返回空指针返回的下标没有顺序要求假设有唯一解,即只能在数组中......
  • Rainbow Bracket Sequence
    The2024ICPCAsiaEastContinentOnlineContest(I)题意构造长度为\(2n\)的合法括号序列。对于每个左括号在的位置\(i\),都有颜色\(c_i\)和价值\(v_i\)。左括号颜色视为所在位置颜色,价值同理。对于每个颜色,满足左括号为该颜色的个数\(\geql_i\)。求满足以上......
  • Rainbow Bracket Sequence
    括号序列匹配+最优化问题+一系列限制条件+较小的数据范围=最小费用最大流模型拆点难以解决重复的问题,既然如此那就不拆点了,用流向代表左右括号的选择每一次bfs,总流量增加,总费用也是增加的,但是退流的边还是要归还费用【直觉就不对劲呀,多想一下吧】注意,当li的限制超过节点总数时......
  • sql 分组查询并新增序号
    在SQL中,你可以使用ROW_NUMBER()函数来为结果集中的每一行新增一个序号。这个序号是基于某个排序条件的分区排序结果。以下是一个简单的例子,假设我们有一个名为students的表,它有两列:class_id和student_name。我们想为同一个班级内的学生创建一个序号,按照student_name排序:SELECT......
  • YC327B [ 20240821 CQYC NOIP 模拟赛 T2 ] 括号串(bracket)
    题意给定\(S\in\{(,),?\}\)。定义深度为括号嵌套的子序列的最大长度除以\(2\)。求出将\(?\)替换为括号的所有括号串的深度之和,对\(998244353\)取模。\(n\le10^6\)。Sol考虑如何把每次贡献只计算一次。不难想到在括号的中心点计算。可以发现,若当前左右括号......
  • 【Leetcode 1370 】 数组序号转换—— 桶计数
    给你一个字符串 s ,请你根据下面的算法重新构造字符串:从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。重复步骤2,直到你没法从 s 中选择字符。从 s 中选出 ......
  • D. Coloring Brackets
    原题链接题解首先,假设当前\(s(l,r)\)括号序列为合法序列,则有如下几种情况:\(l+1==r\)()\(match[r]==l\)(...)\(match[r]!=l\)(...)...(...)code#include<bits/stdc++.h>usingnamespacestd;constlonglongMOD=1e9+7;longlongdp[705][705][3][3]......