CodeForces 701C They Are Everywhere(map的应用)

  这个题比较好的解决办法,我觉得还是map,map的size可以很快的知道我们选了几个字母,而且可以作为计数器,知道每一个字母出现了多少次, erase函数可以清除掉一个元素。

  所以,定义两个指针L和R,当选择的数够了sum个以后,我们移动L指针,开始删除字母,直到不满足为止,然后移动R指针,看有没有其他的满足答案,并及时更新答案。

  代码及注释如下:

  ps:被这个题给虐了……(真是有愧于队友赐我的map小王子的称号……)

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
#define N 100010
#define INF 99999999
map<char,int>mp;
char a[N];
int sum,n;
int main()
{
    int ans = INF;
    cin>>n>>a;
    sum = 0;
    mp.clear();
    for(int i = 0; i < n; i++)
    {
        if(!mp[a[i]])
        {
            sum++;
            mp[a[i]] = 1;
        }
    }
//    cout<<"sum = "<<sum<<endl;
    mp.clear();
    int l = 0,r = 0;
    while(r < n)
    {
        mp[a[r]]++;
        while(l <= r && mp.size()==sum)///直到满足条件,移动L指针
        {
            mp[a[l]]--;
            ans = min(ans,r-l+1);///必须在上面更新
            if(mp[a[l]] == 0)
            {
                mp.erase(a[l]);///及时删除
                l++;///不要忘记移动指针,否则会出错
                break;
            }
            else l++;
        }
        r++;
    }
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/jifahu/p/5749536.html