【题意】给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串。

http://arc081.contest.atcoder.jp/tasks/arc081_c

【算法】字符串DP

【题解】

先考虑计算最短长度,再考虑求字典序最小。

关键在于发掘出【最短的非子序列字符串】具有最优子结构,定义f(s)为字符串s的最短的非子序列字符串长度,假设最短的非子序列字符串为t,当t的第一个字母是c(任意字母)时,只有两种情况:

①s中无c,f(s)=1最短。

②对于s中最左边位置p的c,f(s)=f(s.suffix(p+1))+1,最后这个+1就是c。

很熟悉对吗?①是终止条件,②是状态转移,满足最优子结构性质,当确定第一个字母后,剩余部分可以转化为计算完毕的子问题

那么正式定义状态转移方程,令f[i]表示字符串的后缀i的最短非子序列字符串的长度,pos[i][j]表示从位置i开始第一个字母j出现的位置。

状态转移方程:f[i]=min(f[pos[i][j]+1])+1,0<=j<26。

最后要求字典序最小,从f[0]开始对于每一步找到最小的字母c满足f[i]==f[pos[i][c]]+1输出即可。

复杂度O(n*26)。

考虑清楚边界问题!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=200010;
int f[maxn],pos[maxn][30],n;
char s[maxn];
int main(){scanf("%s",s);n=strlen(s);for(int i=0;i<26;i++)pos[n][i]=n;f[n]=1;f[n+1]=0;//即使没有后缀仍然需要长度为1,f[n]=1;如果没有相同字符的话就f[n+1]+1,所以f[n+1]=0。 for(int i=n-1;i>=0;i--){for(int j=0;j<26;j++)pos[i][j]=pos[i+1][j];pos[i][s[i]-'a']=i;f[i]=n+1;for(int j=0;j<26;j++)f[i]=min(f[i],f[pos[i][j]+1]+1);}int T=f[0],p=0;while(T--){for(int j=0;j<26;j++)if(f[pos[p][j]+1]+1==f[p]){putchar('a'+j);p=pos[p][j]+1;break;}}return 0;
}

View Code

转载于:https://www.cnblogs.com/onioncyc/p/7418332.html

【AtCoder】ARC 081 E - Don't Be a Subsequence相关推荐

  1. 【Atcoder】ARC083 D - Restoring Road Network

    [算法]图论,最短路? [题意]原图为无向连通图,现给定原图的最短路矩阵,求原图最小边权和,n<=300. [题解]要求最小边权和下,原图的所有边一定是所连两端点的最短路. 那么现在将所有最短路 ...

  2. 【AtCoder】ARC095 E - Symmetric Grid 模拟

    [题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ...

  3. 【atcoder】Enclosed Points [abc136F]

    题目传送门:https://atcoder.jp/contests/abc136/tasks/abc136_f 题目大意:在平面上有$n$个点我们,定义一个点集的权值为平面上包含这个点集的最小矩形所包 ...

  4. 【atcoder】GP 2 [agc036C]

    题目传送门:https://atcoder.jp/contests/agc036/tasks/agc036_c 题目大意:给你一个长度为$N$初始全0的序列,每次操作你可以找两个不同的元素,一个自增1 ...

  5. 【AtCoder】AGC034

    AGC034 刷了那么久AtCoder我发现自己还是只会ABCE(手动再见 A - Kenken Race 大意是一个横列,每个点可以跳一步或者跳两步,每个格子是空地或者石头,要求每一步不能走到石头或 ...

  6. 【AtCoder】ARC074

    ARC 074 C - Chocolate Bar 直接枚举第一刀横切竖切,然后另一块要求如果横切分成\(H / 2\)竖切分成\(W/2\)即可 #include <bits/stdc++.h ...

  7. 【iOS】—— ARC学习

    ARC 文章目录 ARC 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象,自己也能持有 不再需要自己持有的对象时释放 无法释放非自己持有的对象 所有权修饰符 在什么时候会用到weak和s ...

  8. 【Atcoder】AtCoder Beginner Contest 174总结

    目录 A Air Conditioner B Distance C Repsept D Alter Altar E Logs F Range Set Query A B C D E F √ √ ● ○ ...

  9. 【AtCoder】ARC088

    C - Multiple Gift 题解 首项是X,每次乘个2,暴力统计 代码 #include <bits/stdc++.h> #define fi first #define se s ...

最新文章

  1. 独家 | 如何跳出编程这个坑
  2. ionic 获取input的值
  3. 重装windows后 用live cd修复ubuntu启动gurb
  4. 分享我工作10年收藏的程序员技术网站
  5. html5 客户端数据缓存机制,深入理解HTML5离线缓存机制
  6. Thinkphp5.0内核仿阿里巴巴小说双端网站源码
  7. [渝粤教育] 重庆电子工程职业学院 物联网工程导论 参考 资料
  8. Mysql 的ERROR 1005 (HY000): Can't create table 'xxx' (errno: 150)
  9. 八大排序算法的时间、空间复杂度和稳定性
  10. 雅马哈推出可以播放黑胶唱片和流行音乐的无线唱盘
  11. Android电话本实现
  12. python白森_江白森002.
  13. 三维管廊大规模实时渲染方案
  14. 改进的Patchwork数字水印算法——C++实现
  15. 数据库的完全依赖,部分依赖和传递依赖
  16. 服务器不正常断电关机导致sqlserver被标记为“可疑”
  17. 前端|利用模态框(Modal)实现弹窗效果
  18. 【转载】BP神经网络
  19. 买的天猫转让网店怎么取名
  20. 华硕灵耀 X 双屏 Pro 评测

热门文章

  1. 关于自学的又一点思考
  2. C#利用NPOI导出Excel
  3. ADO.NET 3.5 同SQL 2008的新的存储过程保存方式
  4. 算法题:I am a student. 转为 student. a am I
  5. 从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求
  6. Ubuntu新版发布周期
  7. zw版【转发·台湾nvp系列Delphi例程】HALCON HighpassImage
  8. Innodb 与自增长auto_increment
  9. 第一章 WebGL简介 Introduction
  10. 警惕同学录联系信息等泄露!