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; }