http://poj.org/problem?id=3320
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
using namespace std;
const int maxn=100005;
int p,a[maxn];
void solve(){
set<int>all;//计算无重复的知识点个数
for(int i=0;i<p;i++){
all.insert(a[i]);
}
int n=all.size();
int s=0,t=0,num=0;
map<int,int>count; //知识点->出现次数的映射
int res=p;
for(;;){
while(t<p&&num<n){
if(count[a[t++]]++==0){//出现新的知识点
num++;
}
}
if(num<n) break;
res=min(res,t-s);
if(--count[a[s++]]==0){//某个知识点的出现次数为0了
num--;
}
}
printf("%d\n",res);
}
int main(){
while(scanf("%d",&p)!=EOF){//用cin超时
for(int i=0;i<p;i++){
scanf("%d",&a[i]);
}
solve();
}
return 0;
}