首页 > 其他分享 >07-25 题解

07-25 题解

时间:2024-07-27 20:42:17浏览次数:11  
标签:子串 25 07 nxt 题解 位置 括号 dp 前缀

07-25 题解

原题出处(按顺序):

CF1556E

CF1234F

P9746

CF1316E

P3651

CF17C

CF1842H

A

转化: 括号序列

  1. 如果 \(a_i\ > b_i\) , 则有 \(a_i - b_i\) 个左括号

  2. 如果 \(a_i\ < b_i\) , 则有 \(b_i - a_i\) 个右括号

(第一个 +1 的位置一定在第一个 -1 的位置的左侧,所以情况一用左括号表示)

问题转化为判断括号序列是否匹配:

  1. 左右括号和为 0
  2. 前缀和中左括号数量 \(\ge\) 右括号

按照 1/-1 的套路做前缀和, 用区间数据结构维护(线段树/st 表)

如何统计操作步数?

每次只能让该位置的数 +1 一次, 即每次只能删除一段连续左/右括号中的一个

所以答案就是前缀和数组的最大值

B

观察:

  1. 只有 20 个小写字母
  2. 反转子串是一种伪操作, 实际上就是选任意两个不相交的子串拼在一起

枚举以每个位置为起点/终点能贡献的 unique 子串(一共最多 20n 个)

对于每一个 unique 子串, 考虑找一个最大的不相交串使得拼起来长度最大

设当前子串的字符集为 \(S\) , 实际上就是找 \(max(T)\ (T\ \in C_{\sum}S)\) (T 在 S 的补集中)

因为两个相交子串的字符集肯定有交集, 所以直接对字符集做高维前缀 max 即可

C

D

我们想要在选 p 的同时保证选的 a 也是最大的

小技巧 : 对 \(a_i\) 降序排序

设当前考虑到了第 \(i\) 个人, \(p\) 个人中选了\(p_0\) 个, 如果 \(i - p_0 < k\) 那么这第 \(i\) 个人是必须选的

然后就做完了

E

本题中的图实际上是多棵基环树, 并且是内向树

基环树:具有N个点N条边的连通图。

内向树:每个点有且只有一条出边。也就是这棵树给人的大体感觉是向内的。

外向树:每个点有且只有一条入边。也就是这棵树给人的大题感觉是外向的。

Trick:对于基环树, 把环和链分开考虑

首先, 所有点最后构成一个环, 每个点的出度、 入度均为 1

然而目前每个点可能有多个入度

  1. 如果没有环的话, 直接贪心地保留每个点修改代价最大的入度即可

  2. 如果有环, 并且环的大小不为 n (否则修改的代价为 0), 一定要断开环上的一条边, 枚举环上节点, 断掉与该节点的最大出度差最小的那条即可

F

一眼 dp

状态

\(n \le 150\), 这意味着 \(a, b, c\) 的个数均 \(\le 51\)

那么就可以写到状态里

\(dp(i, a, b, c)\) 表示考虑到了第 \(i\) 位, 整个串 \(a, b, c\) 分别有这些个

再考虑转移

为了不算重, 如果该位置字符为 s, 我们规定他只能转移到 \(pos \ge i\) 的、 \(s\) 第一次出现的位置

(因为如果转移到一个更靠后的位置, 说明 i 到该位置直接的字符全为 s, 与转移到上述位置是等价的)

记这个位置为 \(nxt[i]\)

则:

(dp[nxt[i][0]][a + 1][b][c] += dp[i][a][b][c]) %= MOD;
(dp[nxt[i][1]][a][b + 1][c] += dp[i][a][b][c]) %= MOD;
(dp[nxt[i][2]][a][b][c + 1] += dp[i][a][b][c]) %= MOD;

为什么直接枚举整个串的 \(a, b, c\) 的个数是正确的?

很简单, 如果这种状态不合法, 那么 dp 值为 0, 不用担心

G

标签:子串,25,07,nxt,题解,位置,括号,dp,前缀
From: https://www.cnblogs.com/Bubblee/p/18327435

相关文章

  • 第二次测试部分题解 (c,d,g)
    c-一个欧拉函数模板题 1#include<iostream>2usingnamespacestd;34intmain()5{6intn;7cin>>n;8intr=n;9for(inti=2;i*i<=n;i++)10{11if(n%i==0)12{13r......
  • 第二次测试部分题解
    A——暴力枚举计数就好了,可以参考这段代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definemod100003#defineMAN1000100charstr[10];intans;voidok(){ ans=0; intlen=0; for(inti=0;str[i]!='\0';i++) len++; if(l......
  • 第十天|栈与队列| 232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串
    目录232.用栈实现队列225.用队列实现栈两个队列模拟栈实现思路1:实现思路2:实现思路3:一个队列模拟栈实现思路1:实现思路2:实现思路3:20.有效的括号1047.删除字符串中的所有相邻重复项方法1:使用Deque堆栈方法2:用字符串直接当作栈方法3:双指针Day10学习到用栈来解......
  • 2024/07/27 每日一题
    LeetCode3106满足距离约束且字典序最小的字符串classSolution:defgetSmallestString(self,s:str,k:int)->str:ans=list(s);res=ord('a')fori,xinenumerate(map(ord,ans)):cnt=min(x-res,res+26-x)......
  • 算法训练 2024.7.27 17:25
    目录1.两数之和2.反转链表3.是否为有效的括号4.最长公共前缀5.合并两个有序数组6.岛屿的个数7.最小路径和8.三数之和9.计数质数10.字符串转换整数(atoi)1.两数之和题目:给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整......
  • protobuf 25.4编译以及visual studio项目配置
    title:protobuf编译配置date:2024-07-2716:00:00categories:other工具安装tags:MSProtobuf下载官方下载地址https://github.com/protocolbuffers/protobuf/releases版本没必要最新,注意自22.0版本开始,有重大改变,CMakelist移至根目录而不是cmake文件夹,......
  • 1251 - Client does not support authentication protocol requested by server; cons
    错误记录:1251-Clientdoesnotsupportauthenticationprotocolrequestedbyserver;considerupgradingMySQLclient错误原因:mysql8之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。解决方案:解决:①升级navicat驱动;②......
  • 代码随想录||day25 非递减子序列,全排列问题
    491非递减子序列力扣题目链接题目描述:给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例1:输入:nums=......
  • ABC260F 题解
    题面根据题目描述,原图为二分图,设两侧点集为\(S,T\),大小为\(s,t(s\le3\times10^5,t\le3\times10^3)\)。注意到有四元环当且仅当\(T\)中存在一个点对\((a,b)\)同时和\(S\)中的某两个点连边。可以先考虑暴力,一种想法是:考虑枚举\(S\)中的点\(c\),设和\(c\)连边的点......
  • ABC263F 题解
    题面注意到把对局在图上表示出来是一颗满二叉树(叶节点为选手,其他点为对局),可以考虑树形dp。设\(x\)为\([l_x,r_x]\)之间选手的比赛,且该节点到叶子结点距离\(d_x\)。设\(f(x,p)\)表示胜者为\(p\)的最大钱数,有转移:\[\begin{aligned}f(x,p)&=f(lson(x),p)+g(rson(x))+a......