Language: C++


#include <iostream>
#include <math.h>
#include <vector>
#include <stack>
#include <cstdio>
#include <string>
#include <bitset>
#include <list>
#include <set>
#include <algorithm>
#include <numeric>
#include <unordered_map>
#include <functional>
#include <queue>
#include <regex>
#include <cassert>
#include <map>
// #include "bits/stdc++.h"

using namespace std;



namespace {
#define rep(i, N, M) for(int i=N, i##_len=(M); i<i##_len; ++i)
#define rep_skip(i, N, M, ...) for(int i=N, i##_len=(M); i<i##_len; i+=(skip))
#define rrep(i, N, M)  for(int i=(M)-1, i##_len=(N-1); i>i##_len; --i)
#define pb push_back


	typedef long long ll;
	typedef unsigned long long ull;
	typedef pair<ll, ll> pll;
	typedef tuple<ll, ll, ll> tll;
	typedef tuple<ll, ll, ll, ll> tll4;
	typedef vector<ll> vll;
	typedef vector<vll> vvll;
	typedef vector<pll> vpll;
	typedef vector<bool> vb;
	typedef vector<vb> vvb;
	typedef vector<string> vs;
	typedef priority_queue<ll> pqll;
	typedef priority_queue<pll, vector<pll>> pqpll;
	typedef priority_queue<ll, vll, greater<ll>> pqll_greater;
	typedef priority_queue<pll, vector<pll>, greater<pll>> pqpll_greater;

#define all(a)  (a).begin(),(a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define vec(a) vector<a>
#define perm(c) sort(all(c));for(bool c##perm=1;c##perm;c##perm=next_permutation(all(c)))


	template<class T, class S>
	T atbit(T n, S i) {
		return (n >> i) % i;
	}

	template<class T>
	T getbit(T i) {
		return 1LL << i;
	}

	constexpr ll POW(ll n, ll m) {
		ll res = 1;
		rep(i, 0, m) {
			res *= n;
		}
		return res;
	}

	vll getDivisors(ll n) {
		vll res;
		ll i = 1;

		for (; i*i < n; i++) {
			if (n%i == 0) {
				res.push_back(i);
				res.push_back(n / i);
			}
		}
		if (i*i == n)res.push_back(i);
		sort(res.begin(), res.end());
		return res;
	}

	vll getDivisors(ll n, ll m) {
		if (n > m) swap(n, m);
		vll res;
		ll i = 1;

		for (; i*i < n; i++) {
			if (n%i == 0) {
				if (m%i == 0) res.push_back(i);
				if (m % (n / i) == 0) res.push_back(n / i);
			}
		}
		if (i*i == n) if (m%i == 0) res.push_back(i);
		sort(res.begin(), res.end());
		return res;
	}


	ll gcd(ll a, ll b) {
		if (a%b == 0) return b;
		else return gcd(b, a%b);
	}

	template<
		typename Inputs,
		typename Functor,
		typename T = typename Inputs::value_type>
		void sort_by(Inputs& inputs, Functor f) {
		std::sort(std::begin(inputs), std::end(inputs),
			[&f](const T& lhs, const T& rhs) { return f(lhs) < f(rhs); });
	}

	template<int I>
	vll proj(vpll v) {
		vll res(v.size());
		rep(i, 0, v.size()) {
			if (!I) res[i] = v[i].first;
			else res[i] = v[i].second;
		}
		return res;
	}


	template<int I, class T>
	vll proj(T v) {
		vll res(v.size());
		rep(i, 0, v.size()) {
			res[i] = get<I>(v[i]);
		}
		return res;
	}
	vector<pll >prime_factorize(ll n) {
		vector<pll> res;
		for (ll p = 2; p*p <= n; ++p) {
			if (n%p != 0)continue;
			ll num = 0;
			while (n%p == 0) { ++num; n /= p; }
			res.push_back({ p,num });
		}
		if (n != 1) res.push_back(make_pair(n, 1));
		return res;
	}

}

ll MOD = 1000000007;
ll INF = 1LL << 60;
string alph = "abcdefghijklmnopqrstuvwxyz";

int main() {
	string A;
	cin >> A;

	ll n = A.size();
	vector<string> dp(n, "");

	vvll next(n, vll(26, n));
	next[n - 1][A.back() - 'a'] = n - 1;
	rrep(i, 0, n - 1) {
		int chr = A[i] - 'a';
		rep(j, 0, 26) {
			if (j != chr) next[i][j] = next[i + 1][j];
			else next[i][j] = i;
		}
	}

	//dp[n - 1] = A.back()== 'a'? 'b':'a';


	auto min_str = [](string& a, string& b) {
		if (a == "") {
			a = b;
		}
		else if (a.size() > b.size()) {
			a = b;
		}
		else if (a.size() == b.size() && a > b) {
			a = b;
		}
	};
	rrep(i, 0, n) {
		rrep(c, 0, 26) {
			if (next[i][c] == n) min_str(dp[i], string(1, alph[c]));
			else {
				auto k = next[i][c];
				if (k + 1 < n) {
					min_str(dp[i], alph.substr(c, 1) + dp[k + 1]);
				}
				else {
					min_str(dp[i], alph.substr(c, 1) + 'a');
				}
				if (next[k + 1][c] != n) dp[next[k + 1][c]].erase();
			}
		}

	}

	cout << dp[0];

	return 0;
}


Compiler output:
a.cc: In function 'int main()':
a.cc:188:53: error: no match for call to '(main()::<lambda(std::string&, std::string&)>) (__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> >, std::__cxx11::basic_string<char> >::value_type&, std::string)'
  188 |                         if (next[i][c] == n) min_str(dp[i], string(1, alph[c]));
      |                                              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
a.cc:188:53: note: candidate: 'void (*)(std::string&, std::string&)' {aka 'void (*)(std::__cxx11::basic_string<char>&, std::__cxx11::basic_string<char>&)'} (conversion)
a.cc:188:53: note:   conversion of argument 3 would be ill-formed:
a.cc:188:61: error: cannot bind non-const lvalue reference of type 'std::string&' {aka 'std::__cxx11::basic_string<char>&'} to an rvalue of type 'std::string' {aka 'std::__cxx11::basic_string<char>'}
  188 |                         if (next[i][c] == n) min_str(dp[i], string(1, alph[c]));
      |                                                             ^~~~~~~~~~~~~~~~~~
a.cc:175:24: note: candidate: 'main()::<lambda(std::string&, std::string&)>' (near match)
  175 |         auto min_str = [](string& a, string& b) {
      |                        ^
a.cc:175:24: note:   conversion of argument 2 would be ill-formed:
a.cc:188:61: error: cannot bind non-const lvalue reference of type 'std::string&' {aka 'std::__cxx11::basic_string<char>&'} to an rvalue of type 'std::string' {aka 'std::__cxx11::basic_string<char>'}
  188 |                         if (next[i][c] == n) min_str(dp[i], string(1, alph[c]));
      |                                                             ^~~~~~~~~~~~~~~~~~
a.cc:192:48: error: no match for call to '(main()::<lambda(std::string&, std::string&)>) (__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> >, std::__cxx11::basic_string<char> >::value_type&, std::__cxx11::basic_string<char>)'
  192 |                                         min_str(dp[i], alph.substr(c, 1) + dp[k + 1]);
      |                                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a.cc:192:48: note: candidate: 'void (*)(std::string&, std::string&)' {aka 'void (*)(std::__cxx11::basic_string<char>&, std::__cxx11::basic_string<char>&)'} (conversion)
a.cc:192:48: note:   conversion of argument 3 would be ill-formed:
a.cc:192:74: error: cannot bind non-const lvalue reference of type 'std::string&' {aka 'std::__cxx11::basic_string<char>&'} to an rvalue of type 'std::__cxx11::basic_string<char>'
  192 |                                         min_str(dp[i], alph.substr(c, 1) + dp[k + 1]);
a.cc:175:24: note: candidate: 'main()::<lambda(std::string&, std::string&)>' (near match)
  175 |         auto min_str = [](string& a, string& b) {
      |                        ^
a.cc:175:24: note:   conversion of argument 2 would be ill-formed:
a.cc:192:74: error: cannot bind non-const lvalue reference of type 'std::string&' {aka 'std::__cxx11::basic_string<char>&'} to an rvalue of type 'std::__cxx11::basic_string<char>'
  192 |                                         min_str(dp[i], alph.substr(c, 1) + dp[k + 1]);
a.cc:195:48: error: no match for call to '(main()::<lambda(std::string&, std::string&)>) (__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> >, std::__cxx11::basic_string<char> >::value_type&, std::__cxx11::basic_string<char>)'
  195 |                                         min_str(dp[i], alph.substr(c, 1) + 'a');
      |                                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a.cc:195:48: note: candidate: 'void (*)(std::string&, std::string&)' {aka 'void (*)(std::__cxx11::basic_string<char>&, std::__cxx11::basic_string<char>&)'} (conversion)
a.cc:195:48: note:   conversion of argument 3 would be ill-formed:
a.cc:195:74: error: cannot bind non-const lvalue reference of type 'std::string&' {aka 'std::__cxx11::basic_string<char>&'} to an rvalue of type 'std::__cxx11::basic_string<char>'
  195 |                                         min_str(dp[i], alph.substr(c, 1) + 'a');
      |                                                        ~~~~~~~~~~~~~~~~~~^~~~~
a.cc:175:24: note: candidate: 'main()::<lambda(std::string&, std::string&)>' (near match)
  175 |         auto min_str = [](string& a, string& b) {
      |                        ^
a.cc:175:24: note:   conversion of argument 2 would be ill-formed:
a.cc:195:74: error: cannot bind non-const lvalue reference of type 'std::string&' {aka 'std::__cxx11::basic_string<char>&'} to an rvalue of type 'std::__cxx11::basic_string<char>'
  195 |                                         min_str(dp[i], alph.substr(c, 1) + 'a');
      |                                                        ~~~~~~~~~~~~~~~~~~^~~~~