【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& ...
随机推荐
- C# Regex正则验证规则
using System; using System.Text.RegularExpressions; namespace MetarCommonSupport { /// <summary&g ...
- Python的scrapy之爬取boss直聘网站
在我们的项目中,单单分析一个51job网站的工作职位可能爬取结果不太理想,所以我又爬取了boss直聘网的工作,不过boss直聘的网站一次只能展示300个职位,所以我们一次也只能爬取300个职位. jo ...
- Kubernetes-apiserver
Kubernetes API服务器为API对象验证和配置数据,这些对象包含Pod.Service.ReplicationController等等.API Server提供REST操作以及前端到集群的共 ...
- 再谈js传值和传址
js的传值和传址还是真绕,前回文说道 1.值类型是传值的 2.对象和数组是传址的 这两点通过例子的到了证实 然而还有一种情况没有讨论 即 函数的参数的传值和传址 通过实验,在函数中用一个新对象去覆盖传 ...
- 1.使用pycharm搭建开发调试环境【转】
感谢 feigamesnb 第一步:安装python2.7环境 去https://www.python.org/downloads/下载windows版本的python,选择2.7版本,按提示安装,并 ...
- oracle 11g XE 学习版添加scott用户方法全步骤
安装企业版的orcale是不是太费时费力了?若只是学习用途的话,不妨试试轻便版的XE版本,同样是官网下载的,但是这个安装起来比完整版简便多了. 首先,你得先安装好orcale 11g XE 版本:(这 ...
- ajax设置自定义头
一.setting参数 headers $.ajax({ headers: { Accept: "application/json; charset=utf-8" ...
- 环境变量 - JDK
Linux 1. 备份并编辑配置文件 # cp /etc/profile /etc/profile.bak # vi /etc/profile 2. 设置JDK环境变量 export JAVA_HOM ...
- thrift安装
yum -y install gcc-c++ autoconf automake sysconftool boost boost-devel libtool perl-ExtUtils-MakeMak ...
- ORA-12546: TNS: 权限被拒绝(ORA - 12546 TNS: Permission Denied)
这个问题上网一查大都是说权限之类的问题,本人在经过第二次折腾之后发现,其实是自己的Oracle客户端工具在破解过程中被自己用防火墙禁止访问网络了,自己还在另一篇博文里记录过,竟然忘光了,BS一下自己! ...