UVA 11572 唯一的雪花
题意:给你从1到n的数组,要求求得其中的最长连续不重复子序列,经典的滑窗问题,方法是维护一个窗口,设置左框和右框,然后不断的进行维护和更新
方法一:
#include"iostream" #include"set" #include"cstring" #include"cstdio" #include"algorithm" using namespace std; const int maxn=1000000+10; set<int>book; int a[maxn]; int main() { int T; cin>>T; while(T--) { int n,t,sum=0,ans=0; cin>>n; book.clear(); for(int i=0;i<n;i++) { cin>>a[i]; } int r=0,l=0; for(;r<n;) { while(!book.count(a[r])&&r<n) { book.insert(a[r]); r++; } ans=max(ans,r-l); book.erase(a[l]); l++; } cout<<ans<<endl; } return 0; }
方法二:
#include"iostream" #include"set" #include"cstring" #include"cstdio" #include"algorithm" using namespace std; const int maxn=1000000+10; int pos[maxn]; int a[maxn]; int main() { int T; cin>>T; while(T--) { int n,t,sum=0,ans=0; cin>>n; memset(pos,-1,sizeof(pos)); for(int i=0;i<n;i++) { cin>>a[i]; } int r=0,l=0; a[n]=a[n-1]; for(int i=0;i<=n;i++) { if(pos[a[i]]>=l) { ans=max(ans,i-l); l=pos[a[i]]+1; } pos[a[i]]=i; } cout<<ans<<endl; } return 0; }
时间: 2024-11-08 16:54:07