UVA11572唯一的雪花

输入一个长度为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;
} 

猜你喜欢

转载自blog.csdn.net/CY05627/article/details/87930871