我是靠谱客的博主 幸福黑裤,这篇文章主要介绍HDU 5672 String(尺取法),现在分享给大家,希望可以做个参考。

Problem Description
There is a string  S . S  only contain lower case English character. (10≤length(S)≤1,000,000)
How many substrings there are that contain at least  k(1≤k≤26)  distinct characters?
 

Input
There are multiple test cases. The first line of input contains an integer  T(1≤T≤10)  indicating the number of test cases. For each test case:

The first line contains string  S .
The second line contains a integer  k(1≤k≤26) .
 

Output
For each test case, output the number of substrings that contain at least  k  dictinct characters.
 

Sample Input
  
  
2 abcabcabca 4 abcabcabcabc 3
 

Sample Output
  
  
0 55
 

Source
BestCoder Round #81 (div.2)
 
题意:给你一个字符串,问你有多少子串包含k个不同的字母。
思路:如果有一段字符刚刚好满足条件,那么后面的包含这个串的子串全部满足,我们可以尺取l和r,对于一个r满足的话,后面len  -  r + 1个子串也满足,然后更新l就可以了,因为l和r是分开更新的,所以复杂度是O(n)。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const double  pi = acos(-1.0);
const int N = 1e6 + 10;
char s[N];
int main()
{
    int t, k, vis[40];
    cin>>t;
    while(t--)
    {
        scanf("%s", s);
        scanf("%d", &k);
        memset(vis, 0, sizeof(vis));
        int l = 0, r = 0, len = strlen(s), temp, num = 0;
        ll ans = 0;
        while(l<len)
        {
            while(r < len && num < k)
            {
                temp = s[r] - 'a';
                if(!vis[temp])
                    num++;
                vis[temp]++;
               r++;
            }
            if(num<k)
                break;
            ans += len - r + 1;
            temp = s[l] - 'a';
            vis[temp]--;
            if(vis[temp]==0)
                num--;
            l++;
        }
        cout<<ans<<endl;
    }
    return 0;
}


最后

以上就是幸福黑裤最近收集整理的关于HDU 5672 String(尺取法)的全部内容,更多相关HDU内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(253)

评论列表共有 0 条评论

立即
投稿
返回
顶部