BestCoder Round

** 题目链接 ** : BestCoder Round #81 (div.2) 1003 String

题意

中文题,上有链接,就不贴了。

思路

枚举起点i,计算可以达到k个不同字母的最小下标j,则此时有子串len-j个。
将所有起点的值加起来即是结果。

代码

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define LL long long

const int MOD = 1000000007;

char str[1000009];
int num[27];

int get_cnt()
{
    int cnt = 0;
    for(int i=0; i<26; i++)
        cnt += num[i]==0?0:1;
    return cnt;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int k;
        memset(num, 0, sizeof(num));
        scanf("%s%d", str, &k);
        int len = strlen(str);
        LL ans = 0;
        int j = -1;
        bool flag = false;
        for(int i=0; i<len; i++)
        {

            while(get_cnt() < k)
            {
                j++;
                if(j == len)
                {
                    flag = true;
                    break;
                }
                num[str[j]-'a']++;
            }

            if(flag)
                break;
            ans += len-j;
            num[str[i]-'a']--;
        }
        printf("%lld\n", ans);
    }
    return 0;
}