题目是很简单的队列维护的题目。
每次加入之前判断该字母是否在队列以及队列的容量是否超过k即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1666
using namespace std;
int q[maxn],inq[maxn];
char s[maxn];
int n,k,t,head,tail,ans,cas=0;
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&k);
scanf("%s",s);
head=1,ans=tail=0;
memset(inq,false,sizeof inq);
for (int i=0; s[i]; i++)
{
if (inq[int(s[i])]) ans++;
q[++tail]=int(s[i]);
if (tail-head+1>k)
{
inq[q[head++]]=false;
}
for (int j=head; j<=tail; j++) inq[q[j]]=true;
}
printf("Case %d: %d
",++cas,ans);
}
return 0;
}