Kalado

Igra “Kalado” funkcioniše tako što igrač kaže reč, a zatim i jedan prirodan broj. Broj treba da predstavlja dužinu prefiksa reči koja je izgovorena (dakle, ne sme biti veći od dužine reči). Zadatak drugog igrača je da smisli reč koja se poklapa po pomenutom prefiksu sa rečju koju je prvi igrač izabrao.

Neka je dat rečnik validnih reči veličine \(n\). Napisati program koji za svaki od unetih \(m\) parova (\(s\), \(d\)) ispituje da li postoji reč iz rečnika koja počinje prefiksom reči \(s\) dužine \(d\).

Opis ulaza

Sa standardnog ulaza se učitavaju prirodni brojevi \(n\) i \(m\) (\(1 \le n, m \le 20000\)) koji predstavljaju redom veličinu rečnika i broj upita. Zatim se učitava \(n\) reči koje čine rečnik i \(m\) upita oblika \(s\ d\), svaki u svom redu.

Opis izlaza

Ispisati za svaki upit u svom redu \(1\) ukoliko postoji reč iz rečnika koja ga zadovoljava, a \(0\) inače.

Primer

Ulaz

5 3 ananas antena banana banovina aligator anotacija 3 ansambl 2 balans 3

Izlaz

0 1 0

Rešenje

Opis glavnog rešenja

U ovom bloku se opisuje glavno rešenje zadatka.

#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>

using namespace std;

struct Node
{
   bool end_node = false;
   unordered_map<char, Node *> children;
};

void add(Node *trie, const string &key)
{
   for (const auto c : key) {
      if (trie->children.find(c) == trie->children.end()) {
         trie->children[c] = new Node();
      }
      trie = trie->children[c];
   }

   trie->end_node = true;
}

bool check_prefix(Node *trie, string& prefix, int n, int i)
{

   while(trie->children.find(prefix[i]) != trie->children.end()) {
      if(i == n-1)
         return true;  
      
      trie = trie->children[prefix[i++]];
   }

   return false;
}

void free(Node *trie)
{
   if (trie != nullptr) {
      for (auto [_, node] : trie->children) {
         free(node);
      }
      delete trie;
   }
}

int main ()
{
   int n, m;
   cin >> n >> m;

   vector<string> words(n);
   for (int i = 0; i < n; i++) {
      cin >> words[i];
   }

   Node *trie = new Node();

   for (const auto &word : words) {
      add(trie, word);
   }

   string s;
   int d;
   while(m--){
      cin >> s >> d;
      cout << check_prefix(trie, s, d, 0) << endl;
   }
   free(trie);

   return 0;
}