题目概述

求所有不是 A 的子序列的最短小写英文字母字符串中字典序最小的一个。

分析

一个类似于 CSP2025-S 中第三题的动态规划。

倒着做。

设 \(f_i\) 表示以 \(A_i\) 为开头的子序列不在 \(A_{i\dots |A|}\) 出现的最短长度。

然后从后面挑一个转移即可。

但是我们发现这样子是 \(\mathcal{O}(n^2)\) 的。

但是我们可供转移的字符集最多只有 \(26\) 个。

于是优化状态:设 \(f_i\) 表示以字符 \(i\) 为开头的子序列不在当前 \(A\) 的后缀当中的最短长度。

\[f_i=1+\min_x f_{p_x}
\]

然后就做完了。

代码

时间复杂度 \(\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 题目分析的更多相关文章

  1. SCTF 2014 pwn题目分析

    因为最近要去做ctf比赛的这一块所以就针对性的分析一下近些年的各大比赛的PWN题目.主防项目目前先搁置起来了,等比赛打完再去搞吧. 这次分析的是去年的SCTF的赛题,是我的学长们出的题,个人感觉还是很 ...

  2. 路由器漏洞复现分析第三弹:DVRF INTRO题目分析

    这个项目的目的是来帮助人们学习X86_64之外其他架构环境,同时还帮助人们探索路由器固件里面的奥秘. 本文通过练习DVRF 中INTRO 部分的题目来学习下MIPS 结构下的各种内存攻击. DVRF: ...

  3. 二分查找总结及部分Lintcode题目分析 2

    Search in a big sorted array,这个比之前的二分法模板多了一个很不同的特性,就是无法知道一个重要的条件end值,也是题目中强调的重点 The array is so big ...

  4. 【算法】题目分析:Aggressive Cow (POJ 2456)

    题目信息 作者:不详 链接:http://poj.org/problem?id=2456 来源:PKU JudgeOnline Aggressive cows[1] Time Limit: 1000M ...

  5. *CTF babyarm内核题目分析

    本文从漏洞分析.ARM64架构漏洞利用方式来讨论如何构造提权PoC达到读取root权限的文件.此题是一个ARM64架构的Linux 5.17.2 版本内核提权题目,目的是读取root用户的flag文件 ...

  6. pat乙级:模拟链表问题(汇总,包含所有pat中链表题目分析)

    更新:优化文章结构,增加了部分内容如(1110区块反转)和自己代码和他人代码分析.看完你就懂了 转载请注明出处和链接地址:(https://www.cnblogs.com/ahappyfool/p/1 ...

  7. SCJP_104——题目分析(5)

    18. public class Test { public static void add3(Integer i) { int val=i.intvalue(); val+=3; i=new Int ...

  8. SCJP_104——题目分析(2)

    3. public class IfTest{ public static void main(String args[]){ int x=3; int y=1; if(x=y) System.out ...

  9. SCJP_104——题目分析(1)

    1.1) public class ReturnIt{2) returnType methodA(byte x, double y){3) return (short)x/y*2;4) }5) }wh ...

  10. Oracle Certified Java Programmer 经典题目分析(一)

    Given: 1. public class returnIt { 2. returnType methodA(byte x, double y){ 3. return (short) x/y * 2 ...

随机推荐

  1. RestCloud ETL与Kettle对比分析

    RestCloud ETL和Kettle都有什么优势和劣势? 我们从平台架构.平台管理.监控分析.数据组件.数据传输.平台性能进行比较如下:

  2. SciTech-BigDataAIML-Tensorflow-Variables

    tf.config.run_functions_eagerly(True) tf.data.experimental.enable_debug_mode() tf.debugging.set_log_ ...

  3. MyBatis之ResultMap标签 -九五小庞

    ResultMap标签基本作用:建立SQL查询结果字段与实体属性的映射关系信息 在深入ResultMap标签前,我们需要了解从SQL查询结果集到JavaBean或POJO实体的过程. 1. 通过JDB ...

  4. 关于CefSharp中C#与JS函数互相调用的应用

    作者:咕魂 时间:2022年5月6日 大量博文可以看到一些C#与JS脚本相互调用的案例,但是不同版本的CefSharp使用时还是有一点不同,博主本次使用的CefSharp版本为100.0.230.0, ...

  5. Gitlab 拉代码免帐密设置方法

    通过 HTTP/HTTPS 拉取 GitLab 仓库时 免输入账号密码,可以用 GitLab 提供的 Personal Access Token(个人访问令牌) 来代替密码,或者设置 Credenti ...

  6. 利用Amazon Bedrock生成AI增强设备维护建议

    在制造业中,服务报告中的宝贵见解往往未被充分利用.本文探讨AWS客户如何构建自动化解决方案:通过生成式AI实现海量报告的数字化处理与关键信息提取. 该方案采用Amazon Nova Pro(基于Ama ...

  7. POSIX 文件系统接口标准

    POSIX文件系统接口标准是​​POSIX(可移植操作系统接口)标准​​的核心组成部分,旨在为操作系统提供统一的文件操作接口,确保应用程序在不同UNIX及类UNIX系统上实现源代码级可移植性.以下是其 ...

  8. 如何监控多个进程的存活和CPU、内存占用

    对于很多偏传统的企业,尚未大规模应用 Kubernetes 技术,也没有为应用埋点,此时进程监控就很关键了.最典型的需求就是监控进程的存活性和进程的资源(CPU.内存等)占用. 本文分享使用夜莺监控开 ...

  9. Java数组操作——3.多维数组

    目录 Java多维数组 二维数组:数组的数组 二维数组的定义与初始化 二维数组的内存结构 访问二维数组元素 遍历二维数组 三维及更高维数组 三维数组的定义与访问 高维数组的适用场景 多维数组的实际应用 ...

  10. 别再为密码管理器付费了!我用 Sealos 一键部署了 Vaultwarden,太香了!

    哈喽兄弟们,是我!今天来聊个扎心的话题:密码管理器. 1Password 太贵,LastPass 不安全,免费的又各种限制... 咱们只想安安静静地记个密码,怎么就这么难? 所以,今天我就来给大家安利 ...