51nod1127 最短的包含字符串 尺取法

Bryce1010模板

这里写图片描述

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
map<char,LL>m;
LL cnt=0;



int main()
{
    //m.clear();
    string str;
    cin>>str;
    LL len=str.length();
    LL res=len+1;
    LL s=0,t=0,sum=0,cnt=0;
    for(;;)
    {
        //cout<<str.substr(s,t)<<endl;
        while(t<len&&cnt<26)
        {
            //cout<<str[t]<<m[str[t]]<<endl;
            if(m[str[t]]==0)
            {
                cnt++;
            }
            //t++;
            m[str[t++]]+=1;
            //cout<<cnt<<endl;
        }
        if(cnt<26)break;
        res=min(res,t-s);
//        cout<<check(str.substr(s,t))<<endl;
        if(--m[str[s++]]==0)
        {
            cnt--;
        }
    }
    if(res>len){cout<<"No Solution"<<endl;}
    else cout<<res<<endl;
    return 0;
}

参考教程:

白书第146页

posted @ 2018-06-14 21:14  Bryce1010  阅读(94)  评论(0编辑  收藏  举报