YEZAELP

TOI14: blockchain (Hashing)

Jul 11th, 2021 (edited)
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.20 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using lli = long long;
  5. const int K = 10241024 + 10;
  6. const lli PB = 98765431;
  7. const int DG = 1e4;
  8. unordered_map <lli, int> cnt;
  9. lli pk[K];
  10.  
  11. int main(){
  12.  
  13.     int T, Q;
  14.     scanf("%d%d", &T, &Q);
  15.  
  16.     pk[0] = 1;
  17.     for(int i=1;i<=K-10;i++){
  18.         pk[i] = pk[i-1] * PB;
  19.     }
  20.  
  21.     for(int t=1;t<=T;t++){
  22.         int n;
  23.         scanf("%d", &n);
  24.         lli hsh = 0;
  25.         for(int i=1;i<n;i++){
  26.             int u, v;
  27.             scanf("%d%d", &u, &v);
  28.             if(u > v) swap(u, v);
  29.             hsh += pk[u * DG + v];
  30.         }
  31.         cnt[hsh] ++;
  32.     }
  33.  
  34.     for(int q=1;q<=Q;q++){
  35.         int n;
  36.         scanf("%d", &n);
  37.         lli hsh = 0;
  38.         for(int i=1;i<n;i++){
  39.             int u, v;
  40.             scanf("%d%d", &u, &v);
  41.             if(u > v) swap(u, v);
  42.             hsh += pk[u * DG + v];
  43.         }
  44.         printf("%d\n", cnt[hsh]);
  45.     }
  46.  
  47.     return 0;
  48. }
  49.  
  50. /*
  51. ระวัง (A, B) (C, D)
  52.     (A, D) (C, B)
  53. เก็บ u, v เป็นตัวเลข
  54. เช่น u = 1024, v = 1024 -> 10241024
  55.     u = 1,    v = 300  ->    10300
  56. แล้วเอาไป hash เก็บทั้งหมดไว้
  57. */
Add Comment
Please, Sign In to add comment