Cod sursa(job #1097349)

Utilizator kiralalaChitoraga Dumitru kiralala Data 3 februarie 2014 12:38:38
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;

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

struct Node
{
    int n,nrs;
    Node* sons[27];
    Node()
    {
        n=nrs=0;
        memset(sons,0,sizeof(sons));
    }
} *Trie;
inline int INT(char *c) { return *c-'a'; }

void Insert(Node *t,char *w)
{
    if(!*w)
        t->n+=1;
    else
    {
        if(!t->sons[INT(w)])
            t->sons[INT(w)]=new Node;
        t->nrs+=1;
        Insert(t->sons[INT(w)],w+1);
    }
}

void Delete(Node *t, char *w)
{
    if(!*w)
        t->n-=1;
    else
    {
        Node *son=t->sons[INT(w)];
        Delete(son,w+1);
        if(son->n==0&&son->nrs==0)
        {
            t->sons[INT(w)]=0;
            t->nrs-=1;
            delete(son);
        }
    }
}

int NumberOfOcurences(Node *t, char *w)
{
    if(!t)
        return 0;
    if(!*w)
        return t->n;
    return NumberOfOcurences(t->sons[INT(w)],w+1);
}

int LongestPrefix(Node *t, char *w)
{
    if(!*w&&t)
        return 0;
    if(!t)
        return -1;

    return 1+LongestPrefix(t->sons[INT(w)],w+1);
}

int main()
{
    int n;
    Trie=new Node;
    while(scanf("%d",&n)!=EOF)
    {
        char w[25];
        scanf(" %s",w);

        switch(n)
        {
            case 0:
                Insert(Trie,w);
            break;
            case 1:
                Delete(Trie,w);
            break;
            case 2:
                printf("%d\n",NumberOfOcurences(Trie,w));
            break;
            case 3:
                printf("%d\n",LongestPrefix(Trie,w));
            break;
        }
    }

    return 0;
}