Cod sursa(job #3041426)

Utilizator _andrei4567Stan Andrei _andrei4567 Data 31 martie 2023 14:55:44
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
///nu am mai scris trie de vreo luna

#include <fstream>
#include <string.h>
#include <string>
#include <map>

using namespace std;

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

const int N = 1e4;

struct trie
{
    trie *v[30];
    int f[30];
    trie ()
    {
        memset (v, 0, sizeof(v));
        memset (f, 0, sizeof(f));
    }
};

trie * head = new trie();

map <string, int> m;

void addtrie (trie *head, char *s)
{
    if (s == NULL)
        return;
    for (int i = 0; i < 26; ++i)
        if ((*s - 'a') == i)
        {
            if (head->v[i] == NULL)
                head->v[i] = new trie();
            head->v[i]->f[i]++;
            addtrie(head->v[i], (s + 1));
            return;
        }
}

void sterge (trie *head, char *s)
{
    if (s == NULL)
        return;
    for (int i = 0; i < 26; ++i)
        if ((*s - 'a') == i)
        {
            head->v[i]->f[i]--;
            sterge (head->v[i], (s + 1));
            return;
        }
}

int prefix (trie *head, char *s)
{
    if (s == NULL)
        return 0;
    for (int i = 0; i < 26; ++i)
        if ((*s - 'a') == i)
        {
            if (head->v[i] != NULL && head->v[i]->f[i])
                return 1 + prefix(head->v[i], (s + 1));
            else
                return 0;
        }
}

int op;

char s[N + 1];

int main()
{
    while (cin >> op >> s)
    {
        if (op == 0)
        {
            m[s]++;
            addtrie(head, s);
        }
        if (op == 1)
        {
            m[s]--;
            sterge (head, s);
        }
        if (op == 2)
        {
            cout << m[s] << '\n';
        }
        if (op == 3)
        {
            cout << prefix (head, s) << '\n';
        }
    }
    return 0;
}