如题
对一个字符串求长度为 k 的字典序最小的子串(不要求连续)
题目链接
Samara Farewell Contest 2020 (XXI Open Cup, GP of Samara)
G. Lexicographically Minimal Subsequence
https://codeforces.com/gym/102916/problem/G
#include <bits/stdc++.h>
#define N 1000005
using namespace std;
int nxt[N][27]; nxt[x][i] :原串第 x 位往右 i 第一个出现的位置。(没有则是-1)
int s[N],f[N];
int n,k;
void getnxt()
{
memset(nxt,-1,sizeof(nxt));
for (int i=n; i>0; i--) {
nxt[i-1][s[i]]=i;
for (int j=0; j<26; j++) if (j!=s[i]) {
nxt[i-1][j]=nxt[i][j];
}
}
}
int main()
{
char ch;
for (ch=getchar(); ch<'a' || ch>'z'; ch=getchar())
;
for (n=0; ch>='a' && ch<='z'; ch=getchar())
s[++n]=ch-'a';
scanf("%d",&k);
getnxt();
int x=0;
for (int o=1; o<=k; o++) {
for (int j=0; j<26; j++) {
if (nxt[x][j]!=-1 && n-nxt[x][j]>=(k-o)) {
x=nxt[x][j];
f[x]=1;
putchar('a'+j);
break;
}
}
}
return 0;
}
/*
bcaabac
4
bcaabac
5
*/