class solution:
def __init__(self,n,k,s):
self.n = n
self.k = k
self.s = s
self.d ={}
self.answer = 0
def calculation(self):
for i in s:
if i in self.d:
self.d[i]+=1
else:
self.d[i]=1
max_num = self.k
self.d ={k: v for k, v in reversed(sorted(self.d.items(), key=lambda item: item[1]))}
enter = True
for i in self.d:
if self.d[i] <= max_num:
self.k -= self.d[i]
self.answer = self.answer + (self.d[i]*self.d[i])
max_num = self.k
else:
self.answer = self.answer + (self.k * self.k)
enter = False
break
if self.k != 0 and enter:
self.answer = self.answer + self.k
n,k = map(int,input().split())
s = input()
root = solution(n,k,s)
root.calculation()
print(root.answer)
#include <bits/stdc++.h>
using namespace std;
//... Gmail: [email protected]
//... Facebook: https://www.facebook.com/profile.php?id=100009621791250
//... Github: https://github.com/ahnafshahrear
typedef long long int i64;
typedef unsigned long long int ui64;
#define vt vector
#define pb push_back
#define Size(v) (int)(v.size())
#define Full(v) v.begin(), v.end()
#define Sort(v) sort(Full(v))
#define ReverseSort(v) sort(v.rbegin(), v.rend())
#define Reverse(v) reverse(Full(v))
#define LineBreak cout << "\n";
#define pi 3.1415926535897932384626
#define pf first
#define ps second
#define mp make_pair
#define LowerBound(v, x) lower_bound(Full(v), x) - v.begin()
// First element not less than x - zero based index
#define UpperBound(v, x) upper_bound(Full(v), x) - v.begin()
// First element greater than x - zero based index
#define Mod 1000000007;
#define Boundary(r, c, row, column) ((r >= 0 && r < row) && (c >= 0 && c < column))
//... Works with zero based index
#define Exit(msg) {cout << msg << "\n"; return;}
#define optimize() ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define fraction() cout.unsetf(ios::floatfield); cout.precision(10); cout.setf(ios::fixed,ios::floatfield);
#define file() freopen("input.txt","r",stdin); freopen("output.txt","w",stdout);
template<typename T> //... cin >> vector
istream& operator>>(istream &istream, vector<T> &v) {for (auto &it : v) cin >> it; return istream;}
template<typename T> //... cout << vector
ostream& operator<<(ostream &ostream, const vector<T> &p) {for (auto &it : p) cout << it << " "; return ostream;}
template<typename T1, typename T2> //... cin >> pair
istream& operator>>(istream &istream, pair<T1, T2> &p) {return (istream >> p.first >> p.second);}
template<typename T1, typename T2> //... cout << pair
ostream& operator<<(ostream &ostream, const pair<T1, T2> &p) {return (ostream << p.first << " " << p.second);}
template<typename T>
void _debug(T a) {
cout << a << "]\n";
}
template<typename T, typename... Args>
void _debug(T a, Args... b) {
cout << a << ", ";
_debug(b...);
}
template<typename... Args>
void debug(Args... b) {cout << '['; _debug(b...);}
bool sortBySec(const pair<int,int> &a, const pair<int,int> &b)
{
return a.second < b.second;
}
int countDigit(int number)
{
return floor(log10(number) + 1);
}
bool isPalindrome(string s)
{
for (int i = 0; i < s.length() / 2; i++)
{
if (s[i] != s[s.length() - i - 1]) return false;
}
return true;
}
void subString(string s)
{
for (int i = 0; i < s.size(); i++)
{
for (int len = 1; len <= s.size() - i; len++)
{
cout << s.substr(i, len) << "\n";
}
}
}
// Solution starts here...
void solve()
{
i64 size, k;
cin >> size >> k;
char x;
map<char, i64> occ;
while (size--)
{
cin >> x;
occ[x]++;
}
vector<i64> values;
for (auto o: occ)
{
values.pb(o.second);
}
ReverseSort(values);
i64 ans = 0;
for (i64 n: values)
{
if (n < k)
{
ans += n * n;
k -= n;
}
else
{
ans += k * k;
break;
}
}
cout << ans;
}
int main()
{
optimize()
int testCase = 1;
if (false)
{
cin >> testCase;
}
for (int t = 1; t <= testCase; t++)
{
solve();
}
return 0;
}
791. Custom Sort String | 787. Cheapest Flights Within K Stops |
779. K-th Symbol in Grammar | 701. Insert into a Binary Search Tree |
429. N-ary Tree Level Order Traversal | 739. Daily Temperatures |
647. Palindromic Substrings | 583. Delete Operation for Two Strings |
518. Coin Change 2 | 516. Longest Palindromic Subsequence |
468. Validate IP Address | 450. Delete Node in a BST |
445. Add Two Numbers II | 442. Find All Duplicates in an Array |
437. Path Sum III | 436. Find Right Interval |
435. Non-overlapping Intervals | 406. Queue Reconstruction by Height |
380. Insert Delete GetRandom O(1) | 332. Reconstruct Itinerary |
368. Largest Divisible Subset | 377. Combination Sum IV |
322. Coin Change | 307. Range Sum Query - Mutable |
287. Find the Duplicate Number | 279. Perfect Squares |
275. H-Index II | 274. H-Index |
260. Single Number III | 240. Search a 2D Matrix II |