【题意】给定长度为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=;
int f[maxn],pos[maxn][],n;
char s[maxn];
int main(){
scanf("%s",s);
n=strlen(s);
for(int i=;i<;i++)pos[n][i]=n;
f[n]=;f[n+]=;//即使没有后缀仍然需要长度为1,f[n]=1;如果没有相同字符的话就f[n+1]+1,所以f[n+1]=0。
for(int i=n-;i>=;i--){
for(int j=;j<;j++)pos[i][j]=pos[i+][j];
pos[i][s[i]-'a']=i;
f[i]=n+;
for(int j=;j<;j++)f[i]=min(f[i],f[pos[i][j]+]+);
}
int T=f[],p=;
while(T--){
for(int j=;j<;j++)if(f[pos[p][j]+]+==f[p]){
putchar('a'+j);
p=pos[p][j]+;
break;
}
}
return ;
}

【AtCoder】ARC 081 E - Don't Be a Subsequence的更多相关文章

  1. 【Atcoder】ARC 080 E - Young Maids

    [算法]数学+堆 [题意]给定n个数的排列,每次操作可以取两个数按序排在新序列的头部,求最小字典序. [题解] 转化为每次找字典序最小的两个数按序排在尾部,则p1和p2的每次选择都必须满足:p1在当前 ...

  2. 【Atcoder】ARC 080 F - Prime Flip

    [算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...

  3. 【AtCoder】 ARC 097

    link C-K-th Substring 题意:找出已知串中第\(k\)大的子串,子串相同的不算 \(k\)好小啊,要怎么做啊 不是[Tjoi2015]弦论吗 算了,直接SAM吧 #include& ...

  4. 【AtCoder】 ARC 096

    link C-Half and Half 题意:三种pizza,可以花\(A\)价钱买一个A-pizza,花\(B\)价钱买一个B-pizza,花\(C*2\)价钱买A-pizza和B-pizza各一 ...

  5. 【AtCoder】 ARC 098

    link C-Attention 题意:一个字符队列,每个位置是\(W\)或\(E\),计算最小的修改数量,使得存在一个位置,它之前的都是\(E\),之后的都是\(F\) #include<bi ...

  6. 【AtCoder】 ARC 099

    link C-Minimization 枚举覆盖\(1\)的区间,两边的次数直接算 #include<bits/stdc++.h> #define ll long long #define ...

  7. 【AtCoder】 ARC 100

    link C-Linear Approximation 给出\(N\)个数\(A_1,A_2,...,A_N\) ,求一个数\(d\),最小化\(\sum_{i=1}^N|A_i-(d+i)|\) 把 ...

  8. 【AtCoder】 ARC 101

    link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...

  9. 【AtCoder】 ARC 102

    link C-Triangular Relationship 发现要么全部是\(K\)的倍数,要么全部是模\(K\)余\(K/2,(K=2n)\) #include<bits/stdc++.h& ...

随机推荐

  1. DedeCMS V5.7sp2最新版本parse_str函数SQL注入漏洞

    织梦dedecms,在整个互联网中许多企业网站,个人网站,优化网站都在使用dede作为整个网站的开发架构,dedecms采用php+mysql数据库的架构来承载整个网站的运行与用户的访问,首页以及栏目 ...

  2. (数据科学学习手札05)Python与R数据读入存出方式的总结与比较

    在数据分析的过程中,外部数据的导入和数据的导出是非常关键的部分,而Python和R在这方面大同小异,且针对不同的包或模块,对应着不同的函数来完成这部分功能: Python 1.TXT文件 导入: 以某 ...

  3. 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django

    近期开始学习基于Linux平台的Django开发,想配置一台可以发布的服务器,经过近一个月的努力,终于掌握了基于Apache和mod-wsgi插件的部署模式,自己也写了一个教程,一是让自己有个记录,二 ...

  4. VS中的快捷键

    1.代码中追踪函数的详细代码:   F12

  5. spring+springmvc+maven+mongodb

    1.前言 最近项目开发使用到了spring+springmvc+maven+mongodb,项目中的框架是用springboot进项开发的,对于我们中级开发人员来说,有利有弊,好处呢是springbo ...

  6. Eclipse 导入项目与 svn 插件关联全过程记录

    文章摘自:http://www.cnblogs.com/xmmcn/archive/2013/03/01/2938365.html 感谢博友分享! Eclipse 导入项目与 svn 插件关联全过程记 ...

  7. Linux下启动Oracle服务和监听程序步骤

    Linux下启动Oracle服务和监听程序启动和关闭步骤整理如下: 1.安装oracle: 2.创建oracle系统用户: 3./home/oracle下面的.bash_profile添加几个环境变量 ...

  8. Returning Values from Bash Functions

    转自:https://www.linuxjournal.com/content/return-values-bash-functions Bash functions, unlike function ...

  9. 【APUE】Chapter15 Interprocess Communication

    15.1 Introduction 这部分太多概念我不了解.只看懂了最后一段,进程间通信(IPC)内容被组织成了三个部分: (1)classical IPC : pipes, FIFOs, messa ...

  10. Qt Charts实践

    Qt Charts的横空出世标志着QWT,QCustomPlot .....时代的终结,让我们开始使用QtCharts吧 在Qt 5.7.0中已经集成了Qt Charts模块,需要在安装Qt的时候把C ...