[UVA - 11572] Unique Snowflakes 題解


此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。

題目鏈接:https://vjudge.net/problem/UVA-11572

題目大意:

輸入第一行有一個數t,表示數據組數。

每組數據給出一個數字N(1<=N<=1000000),接下來N行,每行一個int范圍內的整數,表示一段長度為N的序列。

找出最長的連續子序列,要求這個子序列中沒有重復的數。輸出最長長度。

樣例輸入:

1
5
1
2
3
2
1

樣例輸出:

3
 

分析:

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 }

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: