Cod sursa(job #2883660)

Utilizator Mihai7218Bratu Mihai-Alexandru Mihai7218 Data 1 aprilie 2022 17:56:20
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
    int fr, frch;
    trie *dad;
    trie *next[26];
};
trie * root;
void init(trie *& t, trie * dad)
{
    t = new trie;
    t->fr = 0;
    t->dad = dad;
    for (int i = 0; i < 26; i++)
        t->next[i] = NULL;
}
int o, i;
string s;
int main()
{
    init(root, NULL);
    while (fin >> o >> s)
    {
        if (o == 0)
        {
            trie * t = root;
            for (i = 0; i < s.size(); i++)
            {
                if (t -> next[int(s[i])-'a'] == NULL)
                {
                    trie * q;
                    init(q, t);
                    t -> next[int(s[i])-'a'] = q;
                }
                t = t-> next[int(s[i])-'a'];
            }
            t->fr++;
            while (t != NULL)
            {
                t -> frch ++;
                t = t -> dad;
            }
        }
        else if (o == 1)
        {
            trie * t = root;
            for (i = 0; i < s.size(); i++)
                t = t->next[int(s[i])-'a'];
            t->fr--;
            while (t != NULL)
            {
                t -> frch --;
                t = t -> dad;
            }
        }
        else if (o == 2)
        {
            trie * t = root;
            for (i = 0; i < s.size(); i++)
            {
                if (t->next[int(s[i])-'a'] == NULL)
                {
                    fout << "0\n";
                    break;
                }
                t = t -> next[int(s[i])-'a'];
            }
            if (i == s.size()) fout << t->fr << "\n";
        }
        else if (o == 3)
        {
            trie *t = root;
            for (i = 0; i < s.size(); i++)
            {
                if (t->next[int(s[i])-'a'] == NULL || t->next[int(s[i])-'a']-> frch == 0)
                    break;
                t = t->next[int(s[i])-'a'];
            }
            fout << i << "\n";
        }
    }
    return 0;
}