基本思路:
本题实际上就是找各元素互不相同的最长连续子序列,因为是连续的,所以可以采用滑动窗口来做,若L为窗口的左端点,R为窗口的右端点,则先扩展R,如果不能继续扩展,则扩展L,继续扩展R,直到R指向全序列的最后一个元素。
具体代码:
#include <iostream>
#include <set>
#include <vector>
using namespace std;
vector<int> sf;
int solve()
{
int ans=1;
//int i=0,j=0;
int n=sf.size();
set<int> seq;
seq.clear();
seq.insert(sf[0]);
int i=0,j=1;
for(;i<n;++i)
{
for(;j<n;++j)
{
if(seq.count(sf[j]))
break;
else
seq.insert(sf[j]);
}
ans=max(ans,j-i);
if(j>=n)
break;
seq.erase(sf[i]);
}
return ans;
}
int main()
{
//freopen("input.txt","r",stdin);
int kn;
cin>>kn;
for(int kase=1;kase<=kn;++kase)
{
sf.clear();
int n;
cin>>n;
if(n==0)
{
cout<<"0"<<endl;
continue;
}
for(int i=0;i<n;++i)
{
int t;
cin>>t;
sf.push_back(t);
}
cout<<solve()<<endl;
}
return 0;
}