传送门:https://www.luogu.org/problemnew/show/UVA11572 ->luogu上可以交的
解析:
求最长的不含重复数字的区间
尺取法
设置 l,r 两个指针
对于每个新增的 r ,我们判断它是否在当前划定的 l~r 区间内
如果不在,r++
如果在,退出记录答案,并更新 l ,l 更新到与 r 位置的数字重复的位置
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#define N 1000006
using namespace std;
inline int wread(){
char c(getchar ());int wans(0),flag(1);
while (c<'0' || c>'9'){if (c=='-') flag=-1;c=getchar ();}
while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar ();}
return wans*=flag;
}
int T;
int a[N];
set<int> vis;
int main (){
T=wread();
while (T--){
// memset (vis,false,sizeof vis);
vis.clear();
int n(wread());
for (int i(1);i<=n;++i)
a[i]=wread();
int l(1),r(1),ans(0);
while (r<=n && l<=n){
while (r<=n) {
if (!vis.count(a[r]))
vis.insert(a[r]),r++;
else break;
}
ans=max (ans,r-l);
if (r>n) break;
while (a[l]!=a[r] && l<=n){
vis.erase(a[l]);
l++;
if (l>n) break;
}
vis.erase(a[l]);
l++;
if (l>n) break;
}
printf("%d\n",ans);
}
return 0;
}