讨论 / 第8个点TLE,请大牛指点
AhMyfq 2010-06-03 22:53:00
点我顶贴 收藏 删除
#include<stdio.h>

#include<stdlib.h>

#define HASH 999983

long int hashtable[HASH+1] = {-1},a[HASH+200],fh[HASH+200];

int num[HASH+1],num1,numa,anss,ansi,ansm;

//anss为起点ansi为终点ansm为总个数

long int Hash(long int a);

int main(){

long int k,n,i,j,m,s = 1;

memset(hashtable,0xff,sizeof(hashtable));

scanf("%ld%ld",&n,&k);

for(i = 1; i<=n; i++){

scanf("%ld",&a[i]);

m = Hash(a[i]);

num[m]++;

fh[i] = m;

if(num[m] == k){

num1--;

if(num1 == 0){

if(ansm<numa || ansi-anss>i-s){

anss = s;

ansi = i;

ansm = numa;

}

}

}

j = fh[s];

if(num[m] > k && num[j]>k){

while(1){

m = fh[s];

if(num[m]>k){

num[m]--;

s++; continue;

}

if(num1 == 0 && ansi-anss>i-s){

anss = s;

ansi = i;

ansm = numa;

}

break;

}

}

}

if(ansm<numa) printf("-1");

else printf("%ld %ld",anss,ansi);

system("pause");

return 0;

}

long int Hash(long int a){

long int ret = a%HASH;

while(hashtable[ret] != -1 && hashtable[ret] != a)

ret = (ret+1)%HASH;

if(hashtable[ret] == -1){

numa++;

num1++;

hashtable[ret] = a;

}

return ret;

}

/*

15 2

1 2 3 2 3 2 3 1 2 2 1 3 3 1 1 2

*/

#1 AhMyfq@2010-06-03 22:53:00
回复 删除
无语,居然过了

上面的代码交了一次,居然过了!!

与上一次没有过的是的差别只是

while(1){

m = fh[s];

if(num[m]>k){

num[m]--;

s++; continue;

}

else{

if(num1 == 0 && ansi-anss>i-s){

anss = s;

ansi = i;

ansm = numa;

}

break;

}

}

}

}

中的else去掉了,原以为没有什么差别,可是右提交一次,居然AC

查看更多回复
提交回复