Cod sursa(job #2679312)

Utilizator WladDalwMvladutu cristian vlad WladDalwM Data 30 noiembrie 2020 11:38:09
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");

struct Trie
{
    int cnt;
    int nr;
    Trie *fiu[26];
    Trie()
    {
        cnt = 0;
        nr = 0;
        for(int i = 0; i < 26; ++i)
            fiu[i] = 0;
    }
};

Trie *root;

void insert(Trie *trie, int poz , string w)
{
    if(poz == w.size())
    {trie->nr++;return;}
    int x = w[poz] -'a';
    if(trie->fiu[x] == NULL)
        trie->fiu[x] = new Trie, trie->cnt++;
    insert(trie->fiu[x] , poz + 1 , w);
}

bool erase(Trie *trie, int poz , string w)
{
    if(poz == w.size())
        trie->nr--;
    else
    {
        int x = w[poz] - 'a';
        if(erase(trie->fiu[x] , poz + 1 , w))
            trie->fiu[x] = 0, trie->cnt--;
    }
    if(trie->cnt == 0 && trie->nr == 0 && trie != root)
        return 1;
    return 0;
}
int searchw(Trie *trie , int poz , string w)
{
    if(poz == w.size())
        return trie->nr;
    int x = w[poz] - 'a';
    if(trie->fiu[x] == NULL)
        return 0;
    return searchw(trie->fiu[x] , poz + 1, w);
}

int search(Trie *trie , int poz , string w)
{
    if(poz == w.size())
        return poz;
    int x = w[poz] - 'a';
    if(trie->fiu[x] == NULL)
        return poz;
    return search(trie->fiu[x] , poz + 1, w);
}

int main()
{
    char c;
    string w;
    root = new Trie;
    while(in >> c >> w)
    {
        if(c == '0')
            insert(root , 0 , w);
        if(c == '1')
            erase(root , 0 , w);
        if(c == '2')
            out << searchw(root , 0 , w) << '\n';
        if(c == '3')
            out << search(root , 0 , w) << '\n';
    }

    return 0;
}