I'm trying to solve algorithm task: I need to create MultiMap(key,(values)) using hash-table. I can't use Set and Map libraries. I send code to testing system, but I get time-limit exceeded error on test 20. I don't know what exactly this test contains. The code must do following tasks:
put x y - add pair (x,y).If pair exists, do nothing.
delete x y - delete pair(x,y). If pair doesn't exist, do nothing.
deleteall x - delete all pairs with first element x.
get x - print number of pairs with first element x and second elements.
The amount of operations <= 100000
Time limit - 2s
Example:
multimap.in:
put a a
put a b
put a c
get a
delete a b
get a
deleteall a
get a
multimap.out:
3 b c a
2 c a
0
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
inline long long h1(const string& key) {
    long long number = 0;
    const int p = 31;
    int pow = 1;
    for(auto& x : key){
        number += (x - 'a' + 1 ) * pow;
        pow *= p;
    }
    return abs(number) % 1000003;
}
 inline void Put(vector<vector<pair<string,string>>>& Hash_table,const long long& hash, const string& key, const string& value) {
    int checker = 0;
    for(int i = 0; i < Hash_table[hash].size();i++) {
        if(Hash_table[hash][i].first == key && Hash_table[hash][i].second == value) {
                checker = 1;
            break;
        }
    }
    if(checker == 0){
        pair <string,string> key_value = make_pair(key,value);
        Hash_table[hash].push_back(key_value);
    }
}
 inline void Delete(vector<vector<pair<string,string>>>& Hash_table,const long long& hash, const string& key, const string& value) {
    for(int i = 0; i < Hash_table[hash].size();i++) {
        if(Hash_table[hash][i].first == key && Hash_table[hash][i].second == value) {
            Hash_table[hash].erase(Hash_table[hash].begin() + i);
            break;
        }
    }
}
  inline void Delete_All(vector<vector<pair<string,string>>>& Hash_table,const long long& hash,const string& key) {
    for(int i = Hash_table[hash].size() - 1;i >= 0;i--){
        if(Hash_table[hash][i].first == key){
            Hash_table[hash].erase(Hash_table[hash].begin() + i);
        }
    }
}
inline string Get(const vector<vector<pair<string,string>>>& Hash_table,const long long& hash, const string& key) {
    string result="";
    int counter = 0;
    for(int i = 0; i < Hash_table[hash].size();i++){
        if(Hash_table[hash][i].first == key){
            counter++;
            result += Hash_table[hash][i].second + " ";
        }
    }
    if(counter != 0)
        return to_string(counter) + " " + result + "\n";
    else
        return "0\n";
}
int main() {
    vector<vector<pair<string,string>>> Hash_table;
    Hash_table.resize(1000003);
    ifstream input("multimap.in");
    ofstream output("multimap.out");
    string command;
    string key;
    int k = 0;
    string value;
     while(true) {
        input >> command;
        if(input.eof())
            break;
        if(command == "put") {
            input >> key;
            long long hash = h1(key);
            input >> value;
            Put(Hash_table,hash,key,value);
        }
        if(command == "delete") {
            input >> key;
            input >> value;
            long long  hash = h1(key);
            Delete(Hash_table,hash,key,value);
        } 
        if(command == "get") {
            input >> key;
            long long  hash = h1(key);
            output << Get(Hash_table,hash,key);
        }
        if(command == "deleteall"){
            input >> key;
            long long hash = h1(key);
            Delete_All(Hash_table,hash,key);
        } 
    }  
}
How can I do my code work faster?
 
    