D题 : Division by Two and Permutation
题意:首先我晚上写这道题的时候是没有读懂题意的/wu,后来听了别人的讲解才明白是咋回事。
现在给出一个长度为n的字符串str和一个整数k。k代表的是有k种颜色,要求每种颜色必须要至少要在给出的字符串上涂一个字符。(其他字符可以不涂色)
然后将所有颜色单独任意排列,每个颜色排列的字符串必须是回文串。现在让你求出k种颜色中的回文串最短的字符串的最大值。即 使最短的回文串尽量大。
思路:首先统计出所有的对数,对所有字符除对数外的统计一下。
因为要求每种颜色的串必须是回文串,我们可以将对数均分给k种颜色,即现在的最短长度len=对数/k*2 现在每种颜色的串都是偶数串,如果此时剩余的字符大于等于k即可以在偶数回文串中间加上一个字符即所有颜色的最短字符串为len+1。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=27;
int a[N];
signed main()
{
int t;
cin >> t;
while(t--)
{
int n,k;
string str;
cin >> n >> k;
cin >> str;
memset(a,0,sizeof(a));
int dui=0;
for(int i=0;i<str.size();i++)
{
int j=str[i]-'a';
a[j]++;
if(a[j]>=2)
{
dui++;///统计对数
a[j]-=2;
}
}
int len=dui/k*2;///当前所有颜色的最短偶数回文串
int dan=dui*2-len*k;///剩余的对数字符。
for(int i=0;i<26;i++)
{
if(a[i]>0)dan++;///单个的字符
}
int ans;
if(dan>=k)
{
ans=len+1;
}
else
ans=len;
cout << ans << endl;
}
return 0;
}