此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。
題目鏈接:https://vjudge.net/problem/UVA-11572
題目大意:
輸入第一行有一個數t,表示數據組數。
每組數據給出一個數字N(1<=N<=1000000),接下來N行,每行一個int范圍內的整數,表示一段長度為N的序列。
找出最長的連續子序列,要求這個子序列中沒有重復的數。輸出最長長度。
樣例輸入:
樣例輸出:
分析:
STL set的模板題(大概?)
每次把右端點向右推進,如果沒有重復元素就加進來,出現重復元素就把左端點向右收縮到不再有重復元素。
過程中更新ans。
AC代碼:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<set> 6 7 const int MAXN = 1000003; 8 9 inline void read(int &x) 10 { 11 char ch = getchar(),c = ch;x = 0; 12 while(ch < '0' || ch > '9') c = ch,ch = getchar(); 13 while(ch <= '9' && ch >= '0') x = (x<<1)+(x<<3)+ch-'0',ch = getchar(); 14 if(c == '-') x = -x; 15 } 16 17 std::set <int> s; 18 int t,n,l,r,ans,num[MAXN]; 19 20 inline int Max(int a,int b) 21 {return a>b?a:b;} 22 23 int main() 24 { 25 read(t); 26 for(int T = 1;T <= t;++ T) 27 { 28 s.clear(); 29 l = 0,r = 1,ans = 0; 30 read(n); 31 for(int i = 1;i <= n;++ i) 32 read(num[i]); 33 while(r <= n) 34 { 35 while(s.find(num[r]) == s.end() && r <= n) 36 s.insert(num[r++]); 37 ans = Max(ans,r-l-1); 38 while(s.find(num[r]) != s.end()) s.erase(num[++l]); 39 } 40 printf("%d\n",ans); 41 } 42 return 0; 43 }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。