题目链接:
https://codeforces.com/problemset/problem/1624/D
题目大意:
长为 \(n\) 的字符串,有 \(k\) 种颜色,对字符串进行染色,每种颜色都要出现,但不用每个字符都染色。同一种颜色的字符构成要构成一个回文字符串,求能获得的回文子串中最短的长度的最大值。
思路:
先不染色,找到最大的回文子串,然后将回文子串平分成 \(k\) 份,分了之后的回文字串再在中间加入一个字符仍然是回文的,所以再计算除了分好的字符外,剩下的字符是否大于 \(k\),若大于,那么长度可以再加一。
代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 2e5 + 10;
const int mod = 1;
int T, n, k;
string s;
void solve(){
scanf("%d%d", &n, &k);
cin >> s;
vector <int> cnt(26);
for (char c : s)
cnt[c - 'a']++;
int cntP = 0, cntO = 0;
for (int x : cnt){
cntP += x / 2; //计算总的回文子串的长度
cntO += x % 2; //计算剩下的字符的数量
}
int ans = 2 * (cntP / k);
cntO += 2 * (cntP % k);
if (cntO >= k) ans++; //若满足条件,则答案加一
cout << ans << "\n";
}
int main(){
cin >> T;
while(T--)
solve();
return 0;
}