Problem:
デジットＫ

　

アイヅ赤べこ店では、デジットＫと呼ばれるユニークな「くじ」を販売しています。各くじには、左から右へ向かって1列に$N$個の数字が並んでいます。ただし、書かれているのは１から９までの数字です。

くじの購入者は、これらの数字から$K$個の数字を消去し、残った$N-K$個の数字を左から順番に並べてできる数をポイントとして獲得することができます。たとえば$K=3$のとき、くじに$1414213$と書かれていれば、左から$1$、$1$、$2$を選択して消去することで$4413$ポイントを獲得することができます。

数字の列と整数$K$が与えられたとき、獲得できるポイントの最大値を出力するプログラムを作成せよ。

入力

入力は以下の形式で与えられる。

$N$ $K$
$a_1$ $a_2$ ... $a_N$

１行目に数字の数$N$ ($1 \leq N \leq 200,000$)と整数$K$ ($0 \leq K < N$)が与えられる。２行目にくじに書かれている$N$個の数$a_i$ ($1 \leq a_i \leq 9$)が与えられる。

出力

ポイントの最大値を１行に出力する。

入出力例

入力例１

7 3
1 4 1 4 2 1 3

出力例１

4423

入力例２

4 1
1 1 9 9

出力例２

199

Solution in C++14 (judge verdict: Accepted)

#include <iostream>
#include <vector>
#include <array>
#include <list>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <tuple>
#include <bitset>
#include <memory>
#include <cmath>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <numeric>
#include <climits>
#include <cfloat>
#include <cassert>
#include <random>


int main() {
	int n, k; std::cin >> n >> k;
	std::vector<int> initial(n), point; point.reserve(n - k); for (auto& i : initial) std::cin >> i;
	std::vector<std::vector<int>> next(n); next.back() = std::vector<int>(10, -1); next.back()[initial.back()] = n - 1;
	for (int i = n - 2; i >= 0; --i) {
		next[i] = next[i + 1];
		next[i][initial[i]] = i;
	}
	const auto limit = n - k;
	for (auto i = 0; i < n && point.size() < limit; ++i) {
		int max = 9;
		while (next[i][max] == -1 || next[i][max] - i > k) --max;
		k -= next[i][max] - i;
		i = next[i][max];
		point.push_back(initial[i]);
	}
	for (const auto p : point) std::cout << p;
	std::cout << '\n';
}