Advertisement
snowywhitee

Untitled

Nov 23rd, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4. using namespace std;
  5.  
  6.  
  7. struct node {
  8.     string key;
  9.     vector < vector < string > > a;
  10. };
  11.  
  12. struct bignode {
  13.     vector < node > A;
  14. };
  15.  
  16. int hashfunc(string s)
  17. {
  18.     unsigned int res, pow, p;
  19.  
  20.     res = 0;
  21.     pow = 1;
  22.     p = 31;
  23.  
  24.     for(int i = 0; i < s.length(); i++)
  25.     {
  26.         res += (s[i] - 'A') * pow;
  27.         pow *= p;
  28.     }
  29.  
  30.     return res % 100001;
  31. }
  32.  
  33.  
  34. int key_inchain(vector < bignode > &arr, string k)
  35. {
  36.     int x = hashfunc(k);
  37.     for (int i = 0; i < arr[x].A.size(); i++)
  38.     {
  39.         if (arr[x].A[i].key == k)
  40.         {
  41.             return i;
  42.         }
  43.     }
  44.     return 1;
  45. }
  46.  
  47. string getp(vector < bignode > &arr, string k, vector < string > &elements)
  48. {
  49.     int c = 0;
  50.     int index = key_inchain(arr, k);
  51.     int x = hashfunc(k);
  52.     if (index != -1) //if key exists
  53.     {
  54.         for (int i = 0; i < arr[x].A[index].a.size(); i++)
  55.         {
  56.             c++;
  57.             elements.push_back(arr[x].A[index].a[i]);
  58.         }
  59.     }
  60.     return c;
  61. }
  62.  
  63. void add(vector < bignode > &arr, string k, string v)
  64. {
  65.     int x = hashfunc(k);
  66.     int index = key_inchain(arr, k);
  67.     if (index == -1) //key not there
  68.     {
  69.         node q;
  70.         q.key = k;
  71.         q.a.push_back(v);
  72.         arr[x].A.push_back(q);
  73.     } else {
  74.         int exists = 0;
  75.         for (int i = 0; i < arr[x].A[index].a.size())
  76.         {
  77.             if (arr[x].A[index].a[i] == v)
  78.             {
  79.                 exists = 1;
  80.             }
  81.         }
  82.         if (exists == 0)
  83.         {
  84.             arr[x].A[index].a.push_back(v);
  85.         }
  86.     }
  87. }
  88.  
  89. void del(vector < bignode > &arr, string k, string v)
  90. {
  91.     int index = key_inchain(arr, k);
  92.     int x = hashfunc(k);
  93.    
  94.     if (index != -1) //exist key
  95.     {
  96.         int exists = 0;
  97.         int pairindex = -1;
  98.         for (int i = 0; i < arr[x].A[index].a.size())
  99.         {
  100.             if (arr[x].A[index].a[i] == v)
  101.             {
  102.                 exists = 1;
  103.                 pairindex = i;
  104.             }
  105.         }
  106.  
  107.         if(exists) //exists pair
  108.         {
  109.             if (arr[x].A[index].a.size() == 1) //dell key
  110.             {
  111.                 vector < node > >::iterator it;
  112.                 it = arr[x].A.begin() + index;
  113.                 arr[x].A.erase(it);
  114.             } else {
  115.                 vector < int > >::iterator it;
  116.                 it = arr[x].A[index].a.begin() + pairindex;
  117.                 arr[x].A[index].a.erase(it);
  118.             }
  119.         }
  120.     }
  121. }
  122.  
  123. void delall(vector < bignode > &arr, string k)
  124. {
  125.     int index = key_inchain(arr, k);
  126.     int x = hashfunc(k);
  127.     if (index != -1)
  128.     {
  129.         vector < node > >::iterator it;
  130.         it = arr[x].A.begin() + index;
  131.         arr[x].A.erase(it);
  132.     }
  133. }
  134.  
  135. int main()
  136. {
  137.     bignode default_node;
  138.     vector < bignode > arr (100001, default_node);
  139.    
  140.     ifstream fin("1.txt");
  141.     ofstream fout("map.out");
  142.    
  143.     vector < string > elements;
  144.    
  145.     string command;
  146.     string key;
  147.     string value;
  148.     while (fin >> command)
  149.     {
  150.         if (command == "put")
  151.         {
  152.             fin >> key;
  153.             fin >> value;
  154.             add(arr, key, value);
  155.         } else if (command == "get")
  156.         {
  157.             fin >> key;
  158.             answer = getp(arr, key, elements);
  159.             cout << answer << " ";
  160.             if (answer != 0)
  161.             {
  162.                 for (int i = 0; i < elements.size(); i++)
  163.                 {
  164.                     cout << elements[i] << " ";
  165.                 }
  166.             }
  167.             elements.clear();
  168.             cout << "\n";
  169.         } else if (command == "delete")
  170.         {
  171.             fin >> key >> value;
  172.             del(arr, key, value);
  173.         } else if (command == "deleteall")
  174.         {
  175.             fin >> key;
  176.             delall(arr, key);
  177.         }
  178.     }
  179.     return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement