Cod sursa(job #1553594)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 20 decembrie 2015 02:17:00
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.97 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

struct trie
{
    trie *nxt[32], *phi;
    int val, vall/*, lg*/;

    trie ()
    {
        val = vall = /*lg =*/ 0;
        for (int i = 0; i < 27; ++i)
            nxt[i] = NULL;

  //      phi = NULL;
    }
} *p, *v, *q/*, *poz*/;

char ss[32];

int main ()
{
    freopen ("trie.in", "r", stdin);
    freopen ("trie.out", "w", stdout);

    int op;
    scanf ("%d ", &op);
    gets (ss);

    p = new trie;
    p -> val = p -> vall = 0;
//    p -> lg = 0;

    do
    {
        if (!op)
        {
            v = p;
            int k = 0, n = strlen (ss);
            while (k < n && v -> nxt[ss[k] - 'a'] != NULL)
            {
                v = v -> nxt[ss[k] - 'a'];
                ++(v -> vall);
                ++k;
            }

            if (k < n)
                for (int i = k; i < n; ++i)
                {
                    q = v;
                    q = new trie;
                    v -> nxt[ss[i] - 'a'] = q;
                    q -> val = 0;
                    q -> vall = 1;
                    /*q -> lg = i + 1;

                    while (v -> phi != NULL)
                    {
                        v = v -> phi;
                        if (v -> nxt[ss[k] - 'a'] != NULL) q -> phi = v -> nxt[ss[k] - 'a'];
                    }

                    v = q;
                    if (v -> phi == NULL) v -> phi = p;*/

                    v = q;
                }

            ++(v -> val);
        }

        else if (op == 1)
        {
            v = p;
            int k = 0, n = strlen (ss), ck = -1;
            while (k < n && v -> nxt[ss[k] - 'a'] != NULL)
            {
               // if (v -> val && k < n - 1) poz = v, ck = k;
                v = v -> nxt[ss[k] - 'a'];
                --(v -> vall);
                ++k;
            }

            --(v -> val);
           /* if (ck > -1 && !(v -> val))
                while (ck < n && v -> nxt[ss[ck]])
                {
                    q = v;
                    ++ck;
                    v = v -> nxt[ss[ck]];
                    q -> nxt = NULL;
                }*/
        }

        else if (op == 2)
        {
            v = p;
            int k = 0, n = strlen (ss);
            while (k < n && v -> nxt[ss[k] - 'a'] != NULL)
            {
                v = v -> nxt[ss[k] - 'a'];
                ++k;
            }

            if (k < n) printf ("0\n");
            else printf ("%d\n", v -> val);
        }

        else
        {
            v = p;
            int k = 0, n = strlen (ss);
            while (k < n && v -> nxt[ss[k] - 'a'] != NULL && (v -> nxt[ss[k] - 'a']) -> vall)
            {
                v = v -> nxt[ss[k] - 'a'];
                ++k;
            }

            printf ("%d\n", k);
        }

        scanf ("%d ", &op);
        gets (ss);
    } while (!feof (stdin));

    return 0;
}