Na velikom filmskom festivalu objavljen je katalog sa spiskom svih filmova. Kako bi rad sa katalogom bio brži i pregledniji (npr. u sistemu za rezervaciju karata, glasanju publike ili unosu ocena žirija), svaki film treba da dobije najkraći jedinstveni identifikator.
Identifikator se formira tako što se uzima početak naslova filma, čitajući ga s leva na desno, sve dok taj početak nije dovoljan da ga nedvosmisleno razlikuje od svih ostalih filmova u katalogu. Ako nijedan kraći deo nije dovoljan, ceo naslov postaje identifikator.
Na ovaj način, publika i organizatori mogu brže da ukucaju ili prepoznaju film, bez potrebe da uvek ispisuju njegov ceo naslov.
Sa standardnog ulaza se unosi broj filmova \(n\). Nakon toga se u narednih \(n\) linija unose nazivi filmova.
Na standardni izlaz redom ispisati jedinstvene identifikatore za svaki od filmova.
7 avatar avengers avenger alien aliens batman barbie
ava avengers avenger alien aliens bat bar
U ovom bloku se opisuje glavno rešenje zadatka.
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
struct Node
{
bool end_node = false;
string word = "";
int counter=0;
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->counter++;
}
trie->word = key;
trie->end_node = true;
}
void print(Node *trie)
{
if (trie->end_node) {
cout << trie->word << endl;
}
for (auto [_, node] : trie->children) {
print(node);
}
}
std::string find_unique_prefix(Node *trie, const string &movie)
{
std::string ID = "";
for (const auto c : movie) {
trie = trie->children[c];
ID += c;
if (trie->counter == 1) {
return ID;
}
}
return movie;
}
void free(Node *trie)
{
if (trie != nullptr) {
for (auto [_, node] : trie->children) {
free(node);
}
delete trie;
}
}
int main ()
{
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n; cin >> n;
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);
}
for (const auto &word : words) {
std::cout << find_unique_prefix(trie, word) << "\n";
}
free(trie);
return 0;
}