题目大意:
给n个数, n<=100W,求一个连续子序列,这个子序列中没有重复的数,问这个子序列最长是多少?
set容器的新技能get√
#include<iostream>
#include<cstdio>
#include<set>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+100;
int a[maxn];
int main()
{
int t,n,i,j;
set<int>set;
cin>>t;
while(t--) {
cin>>n;
set.clear();
for(i=0;i<n;i++) cin>>a[i];
int ans,l,r;
ans=l=r=0;
while(r<n) {
while(r<n&&!set.count(a[r])) set.insert(a[r++]);
ans=max(ans,r-l);
set.erase(a[l++]);
}
printf("%d\n",ans);
}
return 0;
}
map容器的做法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
map<int,int>cnt;
const int maxn=1e6+100;
int a[maxn],last[maxn];
int main()
{
int t,n,i,j;
cin>>t;
while(t--) {
cnt.clear();
cin>>n;
for(i=0;i<n;i++) {
cin>>a[i];
if(!cnt.count(a[i])) last[i]=-1;
else last[i]=cnt[a[i]];
cnt[a[i]]=i;
}
int l=0,r=0,ans=0;
while(r<n) {
while(r<n&&last[r]<l) r++;
ans=max(ans,r-l);
l++;
}
printf("%d\n",ans);
}
return 0;
}