Submission #1325901

#TimeUsernameProblemLanguageResultExecution timeMemory
1325901tkm_algorithmsJJOOII 2 (JOI20_ho_t2)C++20
100 / 100
12 ms12476 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define int ll
using P = pair<int, int>;
#define all(x) x.begin(), x.end()
#define rep(i, l, n) for (int i = l; i < (n); ++i)
#define sz(x) (int)x.size()
const char nl = '\n';
const int mod = 998244353;
const int inf = 1e9;

int f(char c) {
	if (c == 'J')return 0;
	if (c == 'O')return 1;
	return 2;
}

void solve() {
	int n, k; cin >> n >> k;
	string s; cin >> s;
	
	int p[n][3], sf[n+1][3];
	memset(p, 0, sizeof p);
	memset(sf, 0, sizeof sf);

	vector<int> g[3];
	rep(i, 0, n)
		g[f(s[i])].push_back(i);

	rep(i, 0, n) {
		p[i][f(s[i])] += 1;
		if (i)rep(j, 0, 3)p[i][j] += p[i-1][j];
	}
	
	for (int i = n-1; i >= 0; --i) {
		sf[i][f(s[i])] += 1;
		if (i < n-1)rep(j, 0, 3)sf[i][j] += sf[i+1][j];
	}
	
	int last = 0, ok= 1, res = inf;
	if (sz(g[0]) < k)last = n-1, ok = 0;
	else last = g[0][k-1];
	
	rep(j, 1, 3) {
		if (sz(g[j]) < p[last][j]+k){ok = 0;break;}
		last = g[j][p[last][j]+k-1];
	}
	
	if (ok)res = last+1-3*k;

	rep(i, 0, n) { // ilki i sany ayyryan.
		ok = true;
		rep(j, 0, 3)
			ok &= (p[i][j] <= sf[0][j]-k);
		if (!ok)break;
		last = i, ok = 1;
		rep(j, 0, 3) {
			if (sz(g[j]) < p[last][j]+k){ok = 0; break;}
			last = g[j][p[last][j]+k-1];
		}
		
		if (ok)res = min(res, last-i-3*k);
	}
	if (res == inf)res = -1;
	cout << res << nl;
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...