题目链接
思路
- 首先统计每个字母出现的个数,然后遍历每个字母统计出现的对数,然后用对数除以k就是平均的长度,如果有单个字母出现并且数量大于k的话可以单个字母放到中间 平均长度加1 由于染色后可以互换位置所以不用担心构不成回文串的情况
代码
#include<cstdio>
#include<cstring>
using namespace std;
const int N=2e5+10;
char str[N];
int cnt[30];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,k;
scanf("%d%d",&n,&k);
scanf("%s",str);
for(int i=0;str[i];i++)cnt[str[i]-'a']++;
int p=0,odd=0;
for(int i=0;i<26;i++)
{
p+=cnt[i]/2;
if(cnt[i]%2)odd++;
}
int res=2*(p/k);
odd+=2*(p%k);
if(odd>=k)res++;
printf("%d\n",res);
memset(cnt,0,sizeof cnt);
}
}