4 5 asdf
dp[i][j] 前i个字符删去j个字符。满足字符串个不相同的个数。
首先 如果每个字符都不相同的时候。
比如
abcd,dp[i][j]=dp[i-1][j-1]+dp[i-1][j].很简单的递推。
但是如果出现之前出现过的字符,会发生什么?
比如 DaP, 然后 出现了a。
DaPa. 删除 DaP,或D_Pa 结果都是a。
假设Pa这段长度为num,
那么 d[i][num] --> dp[i][i]的方案数都会多。
多的肯定是 在D中删除0 - i - num个字符的方案数。
每次减去这些即可
//KX
#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void rd(T&x){
x=0;int f=1;char ch=getchar();
while(ch<'0' ||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); }
while(ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }
x*=f;
}
typedef long long ll;
typedef double db;
const int M = 1e5+7;
#define ls (o<<2)
#define rs (o<<1|1)
#define pb push_back
char s[110];
ll dp[110][110];//前i个字符删去j个的方案数
//尽量删最少的字符。
int pre[27];
int main()
{
ll n,k;
cin>>n>>k;
scanf("%s",s+1);
//初始状态
for(int i=0;i<=n;i++)dp[i][0]=1;
for(int i=1;i<=n;i++)
{
int ch=s[i]-'a';
for(int j=1;j<=i;j++)
dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
//printf("%d %d %d\n",i,j,dp[i][j]);
if(pre[ch]>=1)//之前出现过 当前字符 .. ch P ch 删去 ch P 和 P ch会出现相同的结果。
{
int num=i-pre[ch]; //删num个字符以上会出现重复
for(int j=num;j<=i;j++)
{
dp[i][j]-=dp[pre[ch]-1][j-num];
}
}
pre[ch]=i;
}
ll ans=0;
for(int i=0;i<=n;i++)//从不删字符开始遍历,知道方案数够k个
{
// printf("%d %d \n",i,dp[n][i]);
if(dp[n][i]>k)
{
ans+=k*i;
k=0;
break;
}
k-=dp[n][i];
ans+=dp[n][i]*i;
}
if(k>0)//删完方案也不够k
puts("-1");
else
printf("%lld\n",ans);
return 0;
}