UVa 11572 - Unique Snowflakes (set+滑动窗口思想)

题目大意:

给n个数, n<=100W,求一个连续子序列,这个子序列中没有重复的数,问这个子序列最长是多少?

 

滑动窗口:当右端碰到有相同的数的时候,左端向右滑动一位数(图片出自:https://www.cnblogs.com/aze-003/p/5113562.html

 

使用STL的set函数,保存a[l~r]中的所有元素集合,r增大时判断a[r+1]是否存在,若不存在则加1,否则l++继续判断

#include <iostream>
#include <cstring>
#include <set>
#include <cstdio>
#include <algorithm>
#define N 1e7+10

using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
    while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}

int T,n,a[10000005];
int main()
{

    T=read();
    while(T--){
        n=read();
        for (int i=0;i<n;i++) a[i]=read();
        set<int>s;
        int l=0,r=0,ans=0;
        while(r<n){
            while(r<n&&!s.count(a[r])){
                s.insert(a[r++]);}
                ans=max(r-l,ans);
                s.erase(a[l]);
                l++;
        }
        cout<<ans<<endl;

    }


    return 0;
}

 

posted @ 2018-07-31 01:49  Somnus、M  阅读(201)  评论(0编辑  收藏  举报