Cod sursa(job #1742725)

Utilizator mirupetPetcan Miruna mirupet Data 16 august 2016 22:57:50
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<cstdio>
#include<cstring>
#define Maxim(x, y) (x >= y ? x : y)
using namespace std;

FILE *fin = freopen("trie.in", "r", stdin);
FILE *fout = freopen("trie.out", "w", stdout);

int P;
char S[30];

struct node
{
    int nr = 0;
    node *n[30];
    node()
    {
        memset(n, 0, sizeof(n));
    }
};
node *start = NULL, *p;

int N;
void Update(node *&p, int i)
{
    if (p == NULL)  p = new node;
    if (i == N)
    {
        p -> nr++;
        return;
    }
    Update(p -> n[S[i] - 'a'], i + 1);
}

bool Delete(node *&p, int i)
{
    if (i == N)
    {
        p -> nr--;
        if (p -> nr == 0)
        {
            bool ok = 0;
            for (int j = 0; j < 26; j++)
                ok = ok | (p -> n[j] != NULL);
            if (!ok) p = NULL, delete(p);
            return ok;
        }
        return 1;
    }
    else
    {
        if (!Delete(p -> n[S[i] - 'a'], i + 1))
        {
            if (p -> nr) return 1;
            bool ok = 0;
            for (int i = 0; i < 26; i++)
                ok = ok | (p -> n[i] != NULL);
            if (!ok) p = NULL, delete(p);
            return ok;
        }
        return 1;
    }
}

int Nr(int i, node *p)
{
    if (p == NULL)  return 0;
    if (i == N)     return p -> nr;
    return Nr(i + 1, p -> n[S[i] - 'a']);
}

int Prefix(int i, node *p)
{
    if (p == NULL) return Maxim(i - 1, 0);
    if (i == N)     return i;
    return Prefix(i + 1, p -> n[S[i] - 'a']);
}

int main()
    {
        start = new node;

        while (scanf("%d ", &P) && gets(S))
        {
            N = strlen(S);
            if (P == 0)         Update(start, 0);
            else    if (P == 1) Delete(start, 0);
            else    if (P == 2) printf("%d\n", Nr(0, start));
            else                printf("%d\n", Prefix(0, start));
        }
    }