题意是在一个字符串中选出k个子序列,将子序列任意排序,使每个子序列是回文的,求子序列中长度最小值的最大值。
一道贪心题,要想回文,至多有一个字母出现奇数次,其余字母均出现偶数次,因此答案只与字母出现次数有关,跟字母是谁没关系。
统计出现偶数次字母的总次数,即sum+=x/2
答案 ans满足ans/2*k<=sum
可以二分来写。。
但是小写字母只有26个,因此字符串很长的话,答案一定很大,所以遍历也能过。。。
#include#include #include using namespace std; const int N = 50; signed main() { int T; cin>>T; while(T--) { int n,k; string s; cin>>n>>k>>s; int a[N]={0}; for(char ch : s)a[ch-'a']+=1; int sum=0; for(auto x : a)sum+=x/2; int l=1,r=n/k; while(l >1; if(mid/2*k<=sum)l=mid; else r=mid-1; } // for(int i=n/k;i>=1;i--) // if(i/2*k<=sum) // { // cout<



