Cod sursa(job #2912671)

Utilizator LucaMuresanMuresan Luca Valentin LucaMuresan Data 9 iulie 2022 20:58:46
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;

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

struct trie
{
    int cnt;
    int prfx;

    trie *f[26];

    trie()
    {
        cnt = prfx = 0;
        memset(f, 0, sizeof(f));
    }
};

class Trie
{
protected:
    trie *t;
public:
    Trie()
    {
        t = new trie;
    }

    void ins (string s)
    {
        trie *p = t;
        trie *q;

        for (int i=0; i<s.size(); i++)
        {
            int ch = s[i] - 'a';
            if (p -> f[ch] == NULL)
            {
                q = new trie;
                p -> f[ch] = q;
            }
            p = p -> f[ch];
            p -> prfx++;
        }
        p -> cnt++;
    }

    void del (string s)
    {
        trie*p = t;
        for (int i=0; i<s.size(); i++)
        {
            int ch = s[i] - 'a';
            p = p -> f[ch];
            p -> prfx--;
        }
        p -> cnt--;
    }

    int cntap (string s)
    {
        trie *p = t;
        for (int i=0; i<s.size(); i++)
        {
            int ch = s[i] - 'a';
            if (p -> f[ch] == NULL)
                return 0;
            p = p -> f[ch];
        }
        return p -> cnt;
    }

    int prefix (string s)
    {
        trie *p = t;
        int len = 0;

        for (int i=0; i<s.size(); i++)
        {
            int ch = s[i] - 'a';
            if (p -> f[ch] == NULL)
                return len;
            p = p -> f[ch];
            if (p -> prfx == 0)
                return len;
            len++;
        }
        return len;
    }
};

int main()
{
    Trie t;

    int op;
    string s;

    while (in >> op >> s)
    {
        if (op == 0)
            t.ins(s);
        else if (op == 1)
            t.del(s);
        else if (op == 2)
            out << t.cntap(s) << '\n';
        else
            out << t.prefix(s) << '\n';
    }

    return 0;
}