hash.pp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. { Hash (Associative Array) Access }
  2. {$mode objfpc}
  3. Program hash;
  4. uses SysUtils, Classes;
  5. type
  6. THashEntryPtr = ^THashEntryRec;
  7. THashEntryRec = record
  8. name : string;
  9. number : longint;
  10. next : THashEntryPtr;
  11. end;
  12. const
  13. TABLE_SIZE = 100000;
  14. type THash = class
  15. private
  16. hashtable : array[0..TABLE_SIZE - 1] of THashEntryRec;
  17. function hash(s : string) : longint;
  18. public
  19. constructor Create;
  20. function store(name : string; number : longint; var error : longint)
  21. : boolean;
  22. function fetch(name : string; var number : longint) : boolean;
  23. function exists(name : string) : boolean;
  24. end;
  25. constructor THash.Create;
  26. var
  27. i : longint;
  28. begin
  29. for i := 0 to TABLE_SIZE - 1 do
  30. hashtable[i].next := nil;
  31. end;
  32. function THash.hash(s : string) : longint;
  33. var
  34. i, j : longint;
  35. begin
  36. if length(s) = 0 then Result := 0
  37. else
  38. begin
  39. j := ord(s[1]) mod TABLE_SIZE;
  40. for i := 2 to length(s) do
  41. j := (j shl 8 + ord(s[i])) mod TABLE_SIZE;
  42. Result := j;
  43. end;
  44. end;
  45. function THash.store(name : string; number : longint; var error : longint) :
  46. boolean;
  47. var
  48. node, prev : THashEntryPtr;
  49. begin
  50. error := 0;
  51. prev := @hashtable[hash(name)];
  52. node := prev^.next;
  53. while (node <> nil) and (node^.name <> name) do
  54. begin
  55. prev := node;
  56. node := node^.next;
  57. end;
  58. if node <> nil then error := 1
  59. else begin
  60. new(prev^.next);
  61. node := prev^.next;
  62. if node = nil then error := -1
  63. else begin
  64. node^.name := name;
  65. node^.number := number;
  66. node^.next := nil;
  67. end;
  68. end;
  69. Result := error = 0;
  70. end;
  71. function THash.fetch(name : string; var number : longint) : boolean;
  72. var
  73. node : THashEntryPtr;
  74. begin
  75. node := hashtable[hash(name)].next;
  76. while (node <> nil) and (node^.name <> name) do
  77. node := node^.next;
  78. if node <> nil then number := node^.number;
  79. Result := node <> nil;
  80. end;
  81. function THash.exists(name : string) : boolean;
  82. var
  83. node : THashEntryPtr;
  84. begin
  85. node := hashtable[hash(name)].next;
  86. while (node <> nil) and (node^.name <> name) do
  87. node := node^.next;
  88. Result := node <> nil;
  89. end;
  90. var
  91. n, i, c, err : longint;
  92. X : THash;
  93. begin
  94. if ParamCount = 0 then
  95. n := 1
  96. else
  97. n := StrToInt(ParamStr(1));
  98. if n < 1 then n := 1;
  99. X := THash.Create();
  100. For i := 1 To n do
  101. X.store( Format('%x', [i]), i, err );
  102. c := 0;
  103. For i:= n downto 1 do
  104. begin
  105. if X.exists( IntToStr(i) ) Then Inc(c);
  106. end;
  107. Writeln (IntToStr(c));
  108. end.