51nod1127 最短的包含字符串 尺取法
#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页