输入一个长度为n的序列A, 找到一个尽量长的连续子序列,使得该子序列中没有相同元素。
用set ,O(nlogn) 280ms
用哈希,O(n) 140ms
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
const int N = 1000000+5;
int A[N];
struct hash_mp{
static const int maxn = 0x7fffff;
int num[maxn+1], vis[maxn+1];
void clear(){
memset( vis,0,sizeof(vis) );
}
int& operator[] ( int k ){
int i;
for( i=k&maxn; vis[i]&&num[i]!=k; i=(i+1)&maxn ) ;
num[i] = k;
return vis[i];
}
}hash1;
int main()
{
freopen("in.txt","r",stdin);
int T; scanf("%d",&T);
int n;
//set<int> s;
while( T-- ) {
scanf("%d",&n);
for( int i=0; i<n; ++i ) scanf("%d",&A[i]);
//s.clear();
hash1.clear();
int ans = 0;
int L = 0, R = 0;
while( R<n ){
//while( R<n&&!s.count(A[R]) ) s.insert( A[R++] );
while( R<n&&!hash1[A[R]] ) hash1[A[R++]] = 1;
ans = max( ans,R-L );
//s.erase( A[L++] );
hash1[A[L++]] = 0;
}
printf("%d\n",ans);
}
return 0;
}