Cod sursa(job #1322223)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 19 ianuarie 2015 21:18:36
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>

#define INF (1<<30)
#define mod 666013

using namespace std;
struct Trie
{
    int x, fii;
    Trie *f[27];

    Trie()
    {
        x=fii=0;
        memset(f, 0, sizeof(f));
    }
};

Trie *T = new Trie;
char s[35];
void I(Trie *nod, char *s)
{
    if(*s==0)
    {
        nod->x++;
        return;
    }
    int a=*s-'a';
    if(nod->f[a]==0)
    {
        nod->f[a]=new Trie;
        nod->fii++;
    }
    I(nod->f[a], s+1);
}
int D(Trie *nod, char *s)
{
    int a=*s-'a';
    if(*s==0)
        nod->x--;
    else if(D(nod->f[a], s+1))
    {
        nod->f[a]=0;
        nod->fii--;
    }
    if(nod->x==0&&nod->fii==0&&nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int Q(Trie *nod, char *s)
{
    if(*s==0)
        return nod->x;
    int a=*s-'a';
    if(nod->f[a])
        return Q(nod->f[a], s+1);
    return 0;
}
int P(Trie *nod, char *s, int k)
{
    int a=*s-'a';
    if(*s==0||nod->f[a]==0)
        return k;
    return P(nod->f[a], s+1, k+1);
}
int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    gets(s+1);
    while(!feof(stdin))
    {

        if(s[1]=='0')
            I(T, s+3);
        else if(s[1]=='1')
            D(T, s+3);
        else if(s[1]=='2')
            printf("%d\n", Q(T, s+3));
        else
            printf("%d\n", P(T, s+3, 0));
        gets(s+1);
    }
    return 0;
}