题意:给你一个长度为n的字符串和k种颜料,每种颜料要尽可能的涂在这些字符串上(一个字符只能被一种颜料涂),问涂的这些颜料能形成的回文串的最小值的最大值是多少。
思路:让最小值最大化,就让每种颜料形成的字符串都尽可能的大,因为要形成回文串,那么最多只有一个单个的字符在字符串中(最中间),其他的都必须是成双成对的,那么可以直接记录有多少对相同的字符,然后把他们均分到每种颜料上,再根据剩下的字符看需不需要长度+1即可。
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;
const int N=1000000+100;
int n ,m,h;
char s[N];
void solve()
{
cin>>n>>h;
cin>>s+1;
map<int,int>q;
int res=0;
for(int i=1;i<=n;i++)
{
q[s[i]]++;
if(q[s[i]]==2){
q[s[i]]=0;
res++;
}
}
int x=res,y=n-(x-res%h)*2;
//cout<<x<<" "<<y<<endl;
if(y>=h)
cout<<x/h*2+1<<endl;
else cout<<x/h*2<<endl;
return ;
}
int main()
{
int t;
sc_int(t);
while(t--)solve();
return 0;
}