//目录

Uva 11572 唯一的雪花

题目链接:https://uva.onlinejudge.org/external/115/11572.pdf

题意:找到一个尽量长的连续子序列 A~ AR ,使得该序列没有相同的元素。

分析:枚举超时,怎么优化呢? 当我不停的将右端点右移,当我移不动的时候,说明之前的 l ~ r  里面有一个和 r++的元素相同。

但是,不代表 l ~ r 就没有用了,他本身还是有作用的,只要将 l 右移即可。这样,单看这里,时间复杂度为O(n) ,

然后就是查看 r++ 的元素是否和前面的相同,用 set 集合,时间复杂度是 O(log n) ;

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn = 1000000 + 5;
 6 
 7 int a[maxn];
 8 
 9 int main()
10 {
11     int t;
12     cin>>t;
13     while(t--) {
14         int n;
15         cin>>n;
16         for(int i=0;i<n;i++)
17             cin>>a[i];
18 
19         set<int> s;
20         int L = 0;
21         int R = 0;
22         int ans = 0;
23         while(R<n) {
24             while(R<n&&!s.count(a[R])) s.insert(a[R++]);
25             ans = max(ans,R-L);
26             s.erase(a[L++]);
27         }
28         cout<<ans<<endl;
29     }
30 
31     return 0;
32 }
View Code

 

posted @ 2017-03-16 18:45  小草的大树梦  阅读(350)  评论(0编辑  收藏  举报