C. K-Complete Word
problem Link: Link
code:
Problem Tag: DISJOINT SET UNION(DSU)
- #include <bits/stdc++.h>
- using namespace std;
- const int MAXN = 2e5 + 5;
- char s[MAXN]; int N, K; int par[MAXN], sz[MAXN], cnt[MAXN][26];
- int find(int x) {
- return par[x] == x ? x : par[x] = find(par[x]);
- }
- void Merge(int x, int y) {
- //if (find(x) != find(y)) par[par[x]] = par[y];
- int u = find(x);
- int v = find(y);
- if(u == v) return;
- par[u] = v;
- return;
- }
- int main() {
- int TT;
- cin >> TT;
- while(TT--){
- cin >> N >> K;
- cin >> s+1;
- for (int i = 1; i <= N; i++) par[i] = i, sz[i] = 0, memset(cnt[i], 0, sizeof(cnt[i]));
- for (int i = 1; i <= N / 2; i++) Merge(i, N - i + 1);
- for (int i = 1; i <= N - K; i++) Merge(i, i + K);
- for (int i = 1; i <= N; i++) ++sz[find(i)];
- for (int i = 1; i <= N; i++) {
- int F = find(i); ++cnt[F][s[i] - 'a'];
- }
- int ans = 0;
- for (int i = 1; i <= N; i++)
- if (find(i) == i) {
- int now = 0;
- for (int j = 0; j < 26; j++) now = max(now, cnt[i][j]);
- ans += sz[i] - now;
- }
- printf("%d\n", ans);
- }
- }
Comments
Post a Comment