题目大意:求最长的没有重复的子序列
map实现
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
const int maxn = 1000000 + 5;
int num[maxn];
int last[maxn];
int site[maxn];
int main() {
int test;
int number;
scanf("%d", &test);
while(test--) {
scanf("%d", &number);
for(int i = 0; i < number; i++)
scanf("%d",&num[i]);
int cur = 0;
map<int,int> m;
while(cur < number) {
if(!m.count(num[cur]))
last[cur] = -1;
else
last[cur] = m[num[cur]];
m[num[cur]] = cur;
cur++;
}
int L = 0, R = 0, ans = 0;
while(R < number) {
while(R < number && last[R] < L) R++;
ans = max(ans,R-L);
L++;
}
printf("%d\n",ans);
}
return 0;
}
set实现
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
const int maxn = 1000005;
int number[maxn];
int main() {
int test;
int num;
scanf("%d", &test);
while(test--) {
int ans = 0;
scanf("%d",&num);
for(int i = 0; i < num; i++)
scanf("%d", &number[i]);
int L = 0, R = 0;
set<int > s;
s.clear();
while(R < num) {
while(R < num && !s.count(number[R]))
s.insert(number[R++]);
ans = max(ans,R-L);
s.erase(number[L++]);
}
printf("%d\n", ans);
}
return 0;
}