【AtCoder】ARC 081 E - Don't Be a Subsequence
【题意】给定长度为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的更多相关文章
- 【Atcoder】ARC 080 E - Young Maids
[算法]数学+堆 [题意]给定n个数的排列,每次操作可以取两个数按序排在新序列的头部,求最小字典序. [题解] 转化为每次找字典序最小的两个数按序排在尾部,则p1和p2的每次选择都必须满足:p1在当前 ...
- 【Atcoder】ARC 080 F - Prime Flip
[算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...
- 【AtCoder】 ARC 097
link C-K-th Substring 题意:找出已知串中第\(k\)大的子串,子串相同的不算 \(k\)好小啊,要怎么做啊 不是[Tjoi2015]弦论吗 算了,直接SAM吧 #include& ...
- 【AtCoder】 ARC 096
link C-Half and Half 题意:三种pizza,可以花\(A\)价钱买一个A-pizza,花\(B\)价钱买一个B-pizza,花\(C*2\)价钱买A-pizza和B-pizza各一 ...
- 【AtCoder】 ARC 098
link C-Attention 题意:一个字符队列,每个位置是\(W\)或\(E\),计算最小的修改数量,使得存在一个位置,它之前的都是\(E\),之后的都是\(F\) #include<bi ...
- 【AtCoder】 ARC 099
link C-Minimization 枚举覆盖\(1\)的区间,两边的次数直接算 #include<bits/stdc++.h> #define ll long long #define ...
- 【AtCoder】 ARC 100
link C-Linear Approximation 给出\(N\)个数\(A_1,A_2,...,A_N\) ,求一个数\(d\),最小化\(\sum_{i=1}^N|A_i-(d+i)|\) 把 ...
- 【AtCoder】 ARC 101
link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...
- 【AtCoder】 ARC 102
link C-Triangular Relationship 发现要么全部是\(K\)的倍数,要么全部是模\(K\)余\(K/2,(K=2n)\) #include<bits/stdc++.h& ...
随机推荐
- Python Web开发中,WSGI协议的作用和实现原理详解
首先理解下面三个概念: WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server ...
- vue---day04
1. Node.js 1.1 介绍: - Node.js 是一个JavaScript运行环境,实质上是对Chrome V8引擎的封装. - Node.js 不是一个 JavaScript 框架,不同于 ...
- ABAP CDS ON HANA-(5)テーブル結合ビュー
JOINs in CDS View In ABAP CDS, Join between two data sources is allowed. Allowed joins are:- Inner J ...
- Linux-Shell脚本编程-学习-1-Linux基本命令
在学习Linux-Shell脚本编程之前,我们需要学习一定的Linux基本命令,不然在后面学习Shell脚本编程的的时候,我们就呵呵了. 我学习所用的系统是Ubuntu 16.04版本 也没有什么规则 ...
- Python 3基础教程17-提问频率较高的几个Python问题
这里,介绍几个初学者经常上网查询的问题,直接看下面的例子 # 常见的一些常识问题汇总 #!/user/bin/python # 这个是linux下python文件的写法,告诉程序,这个文件是pytho ...
- 前端----css总结
1,权重计算: 权重:id class 标签--->>>顺序不变 当权重一样时,显示后来设置的 继承下来的标签,权重为0 若权重为0,那么谁描述的近,就显示谁 若权重为0,描述的 ...
- 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略
原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...
- 目标检测之Faster-RCNN的pytorch代码详解(模型训练篇)
本文所用代码gayhub的地址:https://github.com/chenyuntc/simple-faster-rcnn-pytorch (非本人所写,博文只是解释代码) 好长时间没有发博客了 ...
- POJ 1015 Jury Compromise (动态规划)
dp[i][j]代表选了i个人,D(J)-P(J)的值为j的状态下,D(J)+P(J)的最大和. #include <cstdio> #include <cstring> #i ...
- python中字典的循环遍历的两种方式
开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...