using
System;
public
class
GFG
{
public
static
int
[] GetRow(
int
[,] matrix,
int
row)
{
var
rowLength = matrix.GetLength(1);
var
rowVector =
new
int
[rowLength];
for
(
var
i = 0; i < rowLength; i++)
rowVector[i] = matrix[row, i];
return
rowVector;
}
static
int
minimumCost(String s,
int
k) {
int
N = s.Length, ans = 0;
int
[,] dp =
new
int
[N + 1,128];
for
(
int
i = 0; i < N; i++) {
for
(
int
len = i + 1; len > 1; len--) {
int
[] row = GetRow(dp,len-1);
dp[len,s[i]] = (accumulate(row, 0, row.Length));
}
dp[1,s[i]] = 1;
}
int
[] v =
new
int
[N + 1];
v[0] = 1;
for
(
int
i = 1; i <= N; i++) {
int
[] row = GetRow(dp,i);
v[i] += (accumulate(row, 0, row.Length));
}
v = reverse(v);
for
(
int
i = 0; i < v.Length && k > 0; i++) {
long
cantake = Math.Min(k, v[i]);
k -= (
int
)cantake;
ans += (
int
)(i * cantake);
}
return
k > 0 ? -1 : (
int
)ans;
}
static
int
[] reverse(
int
[]a) {
int
i, n = a.Length, t;
for
(i = 0; i < n / 2; i++) {
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
return
a;
}
static
int
accumulate(
int
[] arr,
int
start,
int
end) {
int
sum = 0;
for
(
int
i = 0; i < arr.Length; i++)
sum += arr[i];
return
sum;
}
public
static
void
Main(String[] args) {
String S =
"efef"
;
int
K = 4;
Console.Write(minimumCost(S, K));
}
}