zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    P1121 环状最大两段子段和
    无题
    cdoj 1485 柱爷搞子串 sam treap
    自然数幂和
    Gym 100341C AVL Trees NTT
    线性筛分解质因子
    codeforces 366 Ant Man dp
    UVALive 6914 Maze Mayhem 轮廓线dp
    hdu 5790 Prefix 字典树 主席树
    莫比乌斯反演个人小结
  • 原文地址:https://www.cnblogs.com/jifahu/p/5749536.html
Copyright © 2011-2022 走看看