am1x icon

Untitled

am1x | PRO | 08/20/21 10:27:41 AM UTC | 0 ⭐ | 657 👁️ | Never ⏰ | []
text |

1.48 KB

|

None

|

0 👍

/

0 👎

#include <stdio.h>
#include <assert.h>
#include <inttypes.h>
#include <string.h>
#include <algorithm>
 typedef unsigned int uint_t;
const uint_t N = 5000000, Z = 26, ZA = 32;
 static uint8_t as[N + 1];
 int main()
{
	uint_t n = 0, k = 0;
	int st = scanf("%u%u", &n, &k);
	assert (st == 2);
	assert (0 < n && n <= N);
	assert (k <= N);
	st = scanf("%5000000s", as);
	assert (st == 1);
	as[N] = 0;
	assert (strlen((const char *) as) == n);
//	fprintf(stderr, "n=%u, k=%u, as='%s' \n", n, k, as);
	for (uint_t i = 0; i < n; i++) {
		uint_t x = as[i] - 'a';
		assert (x < Z);
		as[i] = x;
	}
 	uint_t cs[2][ZA];
	for (uint_t i = 0; i < 2; i++) {
		for (uint_t j = 0; j < Z; j++) {
			cs[i][j] = 0;
		}
	}
 	uint_t mcs[2] = {0, 0};
	uint_t pl = 0, pr = 0;
	uint_t res = n <= k + 2 ? n : k + 2;
	if (n <= k + 2)
		goto out;
	while (pr < n) {
		uint_t prm2 = pr % 2;
		uint_t prc = as[pr++];
		cs[prm2][prc]++;
		uint_t omc = mcs[prm2];
		if (prc != omc) {
			if (cs[prm2][prc] > cs[prm2][omc]) {
				mcs[prm2] = prc;
			}
		}
 		for (;;) {
			uint_t d = pr - pl - cs[0][mcs[0]] - cs[1][mcs[1]];
			if (d <= k)
				break;
			assert (pl < pr);
			uint_t plm2 = pl % 2;
			uint_t plc = as[pl++];
			cs[plm2][plc]--;
			if (plc != mcs[plm2])
				continue;
			uint_t mc = std::max_element(cs[plm2], cs[plm2] + Z) - cs[plm2];
			assert (mc < Z);
			mcs[plm2] = mc;
		}
 		if (res < pr - pl)
			res = pr - pl;
	}
out:;
	printf("%u\n", res);
  	return 0;
}
 

Comments