题目:https://vjudge.net/problem/UVA-11572
题目大意:找到一段最长的不重复的序列
思路:设置两个下标l和r,l指向序列最左边的位置,r指向序列最右边的位置,同时用map保存雪花的下标值,如果发现重复出现的雪花,更新最长序列的值,然后更新l,l=max(l,该雪花所在位置+1)
#include<cstdio>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
#include<algorithm>
#include<map>
using namespace std;
#define INF 1<<28
static const int MAX = 1000050;
struct node{
int i;
int snow;
bool operator < (const struct node &p) const
{
if (snow != p.snow)
return snow < p.snow;
return i < p.i;
}
}A[MAX];
map<int, int> S; //第一个表示雪花值,第二个是序号
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int n;
scanf("%d", &n);
int l = 0, r = 0;
int maxl = 0;
S.clear();
for (int i = 0; i < n; i++)
{
int snow;
scanf("%d", &snow);
map<int, int>::iterator it = S.find(snow);
if (it == S.end())
{
S[snow] = i;
r++;
}
else
{
maxl = max(maxl, r - l);
l = max(l, it->second + 1); //最靠近右边的位置(避免包含之前出现的数)
S[snow] = i; //更新位置
r++;
}
}
maxl = max(maxl, r - l);
printf("%d\n", maxl);
}
return 0;
}