从后向前找满足条件的最大子串
因为当满足条件的最大字串为i
那么里面公有i个满足条件的子子串所以只需记录从后向前找的满足条件的最大子串
如果找到了没满足条件的那个数那么这个数找到第k次出现的位置数在向前移一位则满足条件
ac代码如下
运用了vector数组来存储每个字母的个数以用来判断
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<string>
//#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,k;
string s;
scanf("%d",&t);
while(t--)
{
cin>>s;
scanf("%d",&k);
int lastpos = 0;
long long count_ = 0;
vector<int>letter[26];
int len = s.size();
for(int i = 0; i < len; ++i)
{
int l = s[i] -'a';
letter[l].push_back(i);
int sz = letter[l].size();
if(sz > k)
lastpos = max(lastpos,letter[l][sz-k-1]+1);
count_ = count_ + i-lastpos+1;
}
cout<<count_<<'\n';
for(int i = 0;i < 26;++i)
letter[i].clear();
}
return 0;
}