[ARC081E] Don't Be a Subsequence 题目分析
题目概述
求所有不是 A 的子序列的最短小写英文字母字符串中字典序最小的一个。
分析
一个类似于 CSP2025-S 中第三题的动态规划。
倒着做。
设 \(f_i\) 表示以 \(A_i\) 为开头的子序列不在 \(A_{i\dots |A|}\) 出现的最短长度。
然后从后面挑一个转移即可。
但是我们发现这样子是 \(\mathcal{O}(n^2)\) 的。
但是我们可供转移的字符集最多只有 \(26\) 个。
于是优化状态:设 \(f_i\) 表示以字符 \(i\) 为开头的子序列不在当前 \(A\) 的后缀当中的最短长度。
\]
然后就做完了。
代码
时间复杂度 \(\mathcal{O}(n)\)。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define int long long
#define N 200005
#define M 30
using namespace std;
char s[N + M];
int n;
int p[M],f[M],g[N + M];
signed main(){
scanf("%s",s + 1);
n = strlen(s + 1);
for (int i = 0;i < 26;i ++) s[++n] = i + 'a',p[i] = n;
for (int i = n - 26;i >= 0;i --) {
g[i] = p[0];
for (int j = 1;j < 26;j ++)
if (f[j] < f[s[g[i]] - 'a']) g[i] = p[j];
if (i) f[s[i] - 'a'] = f[s[g[i]] - 'a'] + 1,p[s[i] - 'a'] = i;
}
for (int x = g[0];x;x = g[x]) putchar(s[x]);
return 0;
}
入门黑科技:子序列自动机
利用空间换时间的做法。
推荐阅读:https://www.cnblogs.com/zhln/p/18432582
设 \(nxt_{i,j}\) 表示从 \(i\) 开始字符 \(j\) 最开始的位置。
然后按照序列的顺序跑bfs就可以了。
代码
时间复杂度 \(\mathcal{O}(n)\)。
以下代码来自zjc5:
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
char ch[N], ans[N];
int n, nxt[N][26], pre[N], cnt;
bool vs[N];
int main() {
cin >> (ch + 1);
n = strlen(ch + 1);
for (int i = n; i; i--) {
for (int j = 0; j < 26; j++)
nxt[i][j] = nxt[i + 1][j];
nxt[i][ch[i] - 'a'] = i;
}//预处理
queue<int>q;
vs[0] = 1;
q.push(0);
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = 0; i < 26; i++) {
int t = nxt[x + 1][i];
if (!t) {//第一个未被找到的字符串
ans[++cnt] = 'a' + i;
while (x) {
ans[++cnt] = ch[x];
x = pre[x];
}
for (int i = cnt; i; i--)
cout << ans[i];
return 0;
} else if (vs[t])
continue;
pre[t] = x, vs[t] = 1;
q.push(t);
}
}
return 0;
}
[ARC081E] Don't Be a Subsequence 题目分析的更多相关文章
- SCTF 2014 pwn题目分析
因为最近要去做ctf比赛的这一块所以就针对性的分析一下近些年的各大比赛的PWN题目.主防项目目前先搁置起来了,等比赛打完再去搞吧. 这次分析的是去年的SCTF的赛题,是我的学长们出的题,个人感觉还是很 ...
- 路由器漏洞复现分析第三弹:DVRF INTRO题目分析
这个项目的目的是来帮助人们学习X86_64之外其他架构环境,同时还帮助人们探索路由器固件里面的奥秘. 本文通过练习DVRF 中INTRO 部分的题目来学习下MIPS 结构下的各种内存攻击. DVRF: ...
- 二分查找总结及部分Lintcode题目分析 2
Search in a big sorted array,这个比之前的二分法模板多了一个很不同的特性,就是无法知道一个重要的条件end值,也是题目中强调的重点 The array is so big ...
- 【算法】题目分析:Aggressive Cow (POJ 2456)
题目信息 作者:不详 链接:http://poj.org/problem?id=2456 来源:PKU JudgeOnline Aggressive cows[1] Time Limit: 1000M ...
- *CTF babyarm内核题目分析
本文从漏洞分析.ARM64架构漏洞利用方式来讨论如何构造提权PoC达到读取root权限的文件.此题是一个ARM64架构的Linux 5.17.2 版本内核提权题目,目的是读取root用户的flag文件 ...
- pat乙级:模拟链表问题(汇总,包含所有pat中链表题目分析)
更新:优化文章结构,增加了部分内容如(1110区块反转)和自己代码和他人代码分析.看完你就懂了 转载请注明出处和链接地址:(https://www.cnblogs.com/ahappyfool/p/1 ...
- SCJP_104——题目分析(5)
18. public class Test { public static void add3(Integer i) { int val=i.intvalue(); val+=3; i=new Int ...
- SCJP_104——题目分析(2)
3. public class IfTest{ public static void main(String args[]){ int x=3; int y=1; if(x=y) System.out ...
- SCJP_104——题目分析(1)
1.1) public class ReturnIt{2) returnType methodA(byte x, double y){3) return (short)x/y*2;4) }5) }wh ...
- Oracle Certified Java Programmer 经典题目分析(一)
Given: 1. public class returnIt { 2. returnType methodA(byte x, double y){ 3. return (short) x/y * 2 ...
随机推荐
- RestCloud ETL与Kettle对比分析
RestCloud ETL和Kettle都有什么优势和劣势? 我们从平台架构.平台管理.监控分析.数据组件.数据传输.平台性能进行比较如下:
- SciTech-BigDataAIML-Tensorflow-Variables
tf.config.run_functions_eagerly(True) tf.data.experimental.enable_debug_mode() tf.debugging.set_log_ ...
- MyBatis之ResultMap标签 -九五小庞
ResultMap标签基本作用:建立SQL查询结果字段与实体属性的映射关系信息 在深入ResultMap标签前,我们需要了解从SQL查询结果集到JavaBean或POJO实体的过程. 1. 通过JDB ...
- 关于CefSharp中C#与JS函数互相调用的应用
作者:咕魂 时间:2022年5月6日 大量博文可以看到一些C#与JS脚本相互调用的案例,但是不同版本的CefSharp使用时还是有一点不同,博主本次使用的CefSharp版本为100.0.230.0, ...
- Gitlab 拉代码免帐密设置方法
通过 HTTP/HTTPS 拉取 GitLab 仓库时 免输入账号密码,可以用 GitLab 提供的 Personal Access Token(个人访问令牌) 来代替密码,或者设置 Credenti ...
- 利用Amazon Bedrock生成AI增强设备维护建议
在制造业中,服务报告中的宝贵见解往往未被充分利用.本文探讨AWS客户如何构建自动化解决方案:通过生成式AI实现海量报告的数字化处理与关键信息提取. 该方案采用Amazon Nova Pro(基于Ama ...
- POSIX 文件系统接口标准
POSIX文件系统接口标准是POSIX(可移植操作系统接口)标准的核心组成部分,旨在为操作系统提供统一的文件操作接口,确保应用程序在不同UNIX及类UNIX系统上实现源代码级可移植性.以下是其 ...
- 如何监控多个进程的存活和CPU、内存占用
对于很多偏传统的企业,尚未大规模应用 Kubernetes 技术,也没有为应用埋点,此时进程监控就很关键了.最典型的需求就是监控进程的存活性和进程的资源(CPU.内存等)占用. 本文分享使用夜莺监控开 ...
- Java数组操作——3.多维数组
目录 Java多维数组 二维数组:数组的数组 二维数组的定义与初始化 二维数组的内存结构 访问二维数组元素 遍历二维数组 三维及更高维数组 三维数组的定义与访问 高维数组的适用场景 多维数组的实际应用 ...
- 别再为密码管理器付费了!我用 Sealos 一键部署了 Vaultwarden,太香了!
哈喽兄弟们,是我!今天来聊个扎心的话题:密码管理器. 1Password 太贵,LastPass 不安全,免费的又各种限制... 咱们只想安安静静地记个密码,怎么就这么难? 所以,今天我就来给大家安利 ...