贪心
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef __int64 ll; ll n,k; int const MAXN = 100010; char s[MAXN]; struct T{ int x; ll num; }has[50]; int cmp(T a,T b){ if(a.num == b.num) return a.x < b.x; return a.num < b.num; } void Out(){ for(int i = 49;i >= 0;i--){ printf("%d %c\n",has[i].num,has[i].x + 'A'); if(has[i].num == 0) break; } } int main(){ cin>>n>>k; scanf("%s",s); memset(has,0,sizeof(has)); for(int i = 0;s[i];i++){ int x = s[i] - 'A'; has[x].x = x; has[x].num++; } sort(has,has+50,cmp); ll ss = 0; for(int i = 49;i >= 0;i--){ if(!has[i].num) break; if(k <= has[i].num){ ss += k * k; k = 0; } else{ ss += has[i].num * has[i].num; k -= has[i].num; } if(k <= 0)break; } cout<<ss<<endl; return 0; }