Hackerrank

Contacts


We're going to make our own Contacts application! The application must perform two types of operations:
  1. add name, where  is a string denoting a contact name. This must store  as a new contact in the application.
  2. find partial, where  is a string denoting a partial name to search the application for. It must count the number of contacts starting with  and print the count on a new line.
Given  sequential add and find operations, perform each operation in order.
Input Format
The first line contains a single integer, , denoting the number of operations to perform.
Each line  of the  subsequent lines contains an operation in one of the two forms defined above.
Constraints
  • It is guaranteed that  and  contain lowercase English letters only.
  • The input doesn't have any duplicate  for the  operation.
Output Format
For each find partial operation, print the number of contact names starting with  on a new line.
Sample Input
4
add hack
add hackerrank
find hac
find hak
Sample Output
2
0
Explanation
We perform the following sequence of operations:
  1. Add a contact named hack.
  2. Add a contact named hackerrank.
  3. Find and print the number of contact names beginning with hac. There are currently two contact names in the application and both of them start with hac, so we print  on a new line.
  4. Find and print the number of contact names beginning with hak. There are currently two contact names in the application but neither of them start with hak, so we print  on a new line.


#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

class trieNode {
    public:
    int val;
    trieNode *next[26];
    trieNode() {
        val = 0;
    }
};

class Trie {
    private:
        trieNode *root;
  public:
    Trie() {
        for (int i = 0; i < 26; i++) {
            root = new trieNode();
            root -> next[i] = NULL;
        }
    }
    void insert(string input) {
        if (input.size() == 0) {
            return;
        }
        trieNode *trav = root;
        for (int i = 0; i < input.size();i++) {
            int index = input[i] - 'a';
            if (trav -> next[index] == NULL) {
                trav -> next[index] = new trieNode();
            }
            trav -> next[index] -> val++;
            trav = trav -> next[index];
        }
    }
    
    int search(string input) {
        if (input.size() == 0) {
            return 0;
        }
        trieNode *trav = root;
        for (int i = 0; i < input.size();i++) {
            int index = input[i] - 'a';
            if (trav -> next[index] == NULL) {
                return 0;
            }
            trav = trav -> next[index];
        }
        return trav -> val;
    }
    
    ~Trie() {
       deleteTrie(root);
    }
    void static deleteTrie(trieNode *rot) {
        if (rot == NULL) {
            return;
        }
        for (int i = 0; i < 26; i++) {
            if (rot -> next[i] != NULL) {
                deleteTrie(rot -> next[i]);
            }
        }
        delete rot;
    }
};

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */   
    int n;
    cin >> n;
    Trie* trie = new Trie();
    string input, op;
    for (int i = 0; i < n; i++) {
        cin >> op >> input;
        if (op == "add") {
           trie->insert(input); 
        } else if (op == "find") {
            cout << trie->search(input) << endl;
        }
    }
    delete trie;
    return 0;
}


======== 

Find the Running Median






No comments:

Post a Comment