hdu 5183 hash表

BC # 32 1002

题意:给出一个数组 a 和一个数 K ,问是否存在数对( i , j ),使 a   - a i + 1 +……+ (-1)j - i  a 

对于这道题,一开始就想到了是前缀和,但是如果只是记录下前缀和数组,那么查找就会成为一个大问题。补题的时候一开始考虑用 hash 数组或者是 set 存,但是很明显 TLE 了,在翔神的推荐下,我研究了一下 hash表的创建过程,惊奇地发现,其实就是建了一个 HashMap 结构体,而里面放了这个表所用的数组以及相应操作的函数。其中创建 HashMap 就是将表的大小(size)定为0,然后将所有值所指的头定为 -1 ,插入数值操作完全和创建链式前向星一样,只是只有一条链而链式前向星有多个点的多条链而已,而查找 Hash 值也是和链式前向星的遍历一样。

 1 #include<stdio.h>

 2 #include<string.h>

 3 #define ll long long

 4 

 5 const int MAXM=1000007;

 6 ll a[MAXM];

 7 

 8 ll read(){

 9     ll f=1,x=0;

10     char c=getchar();

11     while(c>'9'||c<'0'){

12         if(c=='-')f=-1;

13         c=getchar();

14     }

15     while(c<='9'&&c>='0'){

16         x=x*10+c-'0';

17         c=getchar();

18     }

19     return x*f;

20 }

21 

22 struct HashMap{

23     int next[MAXM],head[MAXM],size;

24     ll state[MAXM];

25     void init(){

26         size=0;

27         memset(head,-1,sizeof(head));

28     }

29     bool check(ll val){

30         int h=(val%MAXM+MAXM)%MAXM;

31         for(int i=head[h];~i;i=next[i]){

32             if(state[i]==val)return 1;

33         }

34         return 0;

35     }

36     bool insert(ll val){

37         int h=(val%MAXM+MAXM)%MAXM;

38         for(int i=head[h];~i;i=next[i]){

39             if(state[i]==val)return 1;

40         }

41         state[size]=val;

42         next[size]=head[h];

43         head[h]=size++;

44         return 0;

45     }

46 }H1,H2;

47 

48 int main(){

49     int T;

50     while(scanf("%d",&T)!=EOF){

51         for(int q=1;q<=T;q++){

52             H1.init();

53             H1.insert(0);

54             H2.init();

55     //        H2.insert(0);

56             int n,k;

57             n=read();

58             k=read();

59             int i;

60             ll s=0;

61             bool f=0;

62             for(i=0;i<n;i++) a[i]=read();

63             for(i=0;i<n&&!f;i++){

64                 if(i&1){

65                     s-=a[i];/*

66                     if(H1.check(s-k)){

67                         f=1;

68                     }

69                     H1.insert(s);*/

70                 }

71                 else{

72                     s+=a[i];/*

73                     if(H2.check(-s-k)){

74                         f=1;

75                     }

76                     H2.insert(-s);*/

77                 }

78                 if(H1.check(s-k)||H2.check(-s-k))f=1;

79                 if(i&1){

80                     H1.insert(s);

81                 }

82                 else H2.insert(-s);

83             }

84             if(f)printf("Case #%d: Yes.\n",q);

85             else printf("Case #%d: No.\n",q);

86         }

87     }

88     return 0;

89 }
View Code

 

你可能感兴趣的:(hash表)