题目链接
セルゲイB.、ポケモンの若いコーチは、左から右にn個の干潟で構成されて大きな家が行に命じ発見しました。通りから、各フラットを入力することが可能です。各フラットから外出することが可能です。また、各フラット左に平坦と右側に平坦に接続されています。フラット番号1は、フラット番号2及びフラット番号に接続されたnのみフラット数nと接続されている- 1。
これらの干潟のそれぞれにおけるいくつかのタイプの正確に一つのポケモンがあります。セルゲイB.は彼がキャッチポケモンのために自分のフラットを入力できるように、家の住民に尋ねました。家の住民と協議した後セルゲイB.は、ストリートから1つのフラットを入力して、いくつかの干潟を訪問し、その後、いくつかのフラットから出て行くように決めました。しかし、彼らは彼が複数回同一平面を訪問させません。
セルゲイB.は非常に喜んでいた、そして今、彼はこの家に表示されるすべてのタイプの収集のポケモンするために、できるだけ少ないフラットを訪問することを望んでいます。あなたの仕事は彼を助け、彼が訪問している干潟のこの最小数を決定することです。
家の中でフラットの数 - 最初の行は、整数N(1≤N≤100 000)を含みます。
2行目は長さs行が含まれているN、それが英語のアルファベットの大文字と小文字で構成され、i番目の文字は、平坦番号iにあるポケモンの種類に等しいです。
`
セルゲイB.が家の中にあるすべてのタイプのポケモンを捕まえるために訪問するべきで干潟の最小数を印刷します。
質問の意味:あなたが最短に行きたいように注意を払う必要があること、そして、あなたはすべてこの辺異なるエルフをキャッチしたい、各部屋には、未知の霊を持つエルフ、(1〜n)のですが、あなただ怠惰部屋の数は、その後、別のエルフのすべてをキャッチ。
アイデア:エルフは同様に可能性があるため、と、そのマップのマーカーを使用して、借り拡張例2と同じ理由が
実施されること!!!ACのアウト
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
map<int,int> st;
int a[100001];
int main(){
int n;
cin>>n;
char c;
set<int> s;
for(int i=0;i<n;i++){
cin>>c;
a[i] = c-'A'+1;
s.insert(a[i]);
}
int cnt = s.size();//确定小精灵的数量
s.clear();
int s1 = 0,t=0,sum=0;
int res = inf;
while(1){
while(sum < cnt && t < n){
if(st[a[t++]]++==0){
sum++;
}
}
if(sum<cnt) break;
res = min(res,t-s1);
if(--st[a[s1++]]==0){
sum--;
}
}
cout<<res<<endl;
return 0;
}