问题描述
有一个 10≤10\leq10≤长度≤1,000,000\leq 1,000,000≤1,000,000 的字符串,仅由小写字母构成。求有多少个子串,包含有至少k(1≤k≤26)k(1 \leq k \leq 26)k(1≤k≤26)个不同的字母?
输入描述
输入包含多组数据. 第一行有一个整数T(1≤T≤10)T (1\leq T\leq 10)T(1≤T≤10), 表示测试数据的组数. 对于每组数据: 第一行输入字符串SSS。 第二行输入一个整数kkk。
输出描述
对于每组数据,输出符合要求的子串的个数。
输入样例
2 abcabcabca 4 abcabcabcabc 3
输出样例
0
55
【分析】一看就知道了这是个two pointers!然后写代码,一直过不了样例啊。还以为是two pointers写错了,最后队友告诉我是答案这里记录错了!果然是。。。
【AC代码】
0
55
【分析】一看就知道了这是个two pointers!然后写代码,一直过不了样例啊。还以为是two pointers写错了,最后队友告诉我是答案这里记录错了!果然是。。。
【AC代码】
//cpp
#include <stdio.h>
#include <map>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000010;
int pos[30];
char s[1000003];
int main()
{
int T,k;
scanf("%d",&T);
while(T--){
memset(pos,0,sizeof(pos));
scanf("%s%d",s,&k);
int len=strlen(s);
long long int ans=0;
int l=0;
for(int i=0;i<len;i++){
int t=0;
pos[s[i]-'a']++;
for(int j=0;j<26;j++){
if(pos[j]) t++;
}
if(t==k){
for(int j=l;j<=i;j++){
ans+=1ll*(len-i);
pos[s[l]-'a']--;
if(!pos[s[l++]-'a']) break;
}
}
}
printf("%I64d\n",ans);
}
return 0;
}