Cod sursa(job #2596699)

Utilizator CharacterMeCharacter Me CharacterMe Data 10 aprilie 2020 11:34:04
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");

struct TrieNode{
    int total, ends;
    map<char, TrieNode*> next;

    TrieNode(int _total = 0, int _ends = 0):
        total(_total), ends(_ends){next.clear();}

};

int task, l;
string s;
TrieNode* root;

void append(int pos, TrieNode* now);
void elim(int pos, TrieNode* now);
int countApp(int pos, TrieNode* now);
int findPrefix(int pos, TrieNode* now);

int main()
{

    root = new TrieNode();

    while(fin >> task){
        fin >> s;
        l = s.length();

        switch(task){
            case 0:{append(0, root); break;}
            case 1:{elim(0, root); break;}
            case 2:{fout << countApp(0, root) << "\n"; break;}
            default: fout << findPrefix(0, root) + 1 << "\n";
        }

    }

    return 0;
}

void append(int pos, TrieNode* now){
    ++now->total;
    if(pos == l) {
        ++now->ends;
        return;
    }

    if(now->next.find(s[pos]) == now->next.end()) {
        now->next.insert({s[pos], new TrieNode()});
    }

    append(pos + 1, now->next[s[pos]]);

}

void elim(int pos, TrieNode* now){
    --now->total;
    if(pos == l){
        --now->ends;
        return;
    }

    elim(pos + 1, now->next[s[pos]]);

    if(now->next[s[pos]]->total == 0){
        delete now->next[s[pos]];
        now->next.erase(now->next.find(s[pos]));
    }
}

int countApp(int pos, TrieNode* now){
    if(pos == l) return now->ends;
    return countApp(pos + 1, now->next[s[pos]]);

}

int findPrefix(int pos, TrieNode* now){
    if(!pos && now->total == 1) return -1;
    if(pos == l) return pos - 1;

    if(now->next[s[pos]]->total > 1) return findPrefix(pos + 1, now->next[s[pos]]);
    else return pos;

}