Cod sursa(job #923709)

Utilizator tudy23Coder Coder tudy23 Data 23 martie 2013 19:48:33
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cstdio>
using namespace std;
const int N=100100;
struct TRIE
{
    int val;
    int pref;
    TRIE *A[27];
}*trie;
void add(char cuv[21])
{
    int poz=0;
    TRIE *aux=new TRIE;
    TRIE *aux2;
    aux=trie;
    while(cuv[poz]!='\0')
    {
        if(aux->A[cuv[poz]+1-'a']==0){
        aux2=new TRIE;
        aux2->val=0;
        aux2->pref=0;
        aux->A[cuv[poz]-'a'+1]=aux2;}
        aux=aux->A[cuv[poz]-'a'+1];
        aux->pref++;
        if(cuv[poz+1]=='\0')
            aux->val++;
        ++poz;
    }
}
void del(char cuv[21])
{
    int poz=0;
    TRIE *aux;
    aux=trie;
    while(cuv[poz]!='\0'&&aux!=0)
    {
        aux=aux->A[cuv[poz]+1-'a'];
        if(aux!=0){
            aux->pref--;
            if(cuv[poz+1]=='\0')
                aux->val--;
        }
        poz++;
    }
}
int apar(char cuv[21])
{
    int poz=0;
    TRIE *aux;
    aux=trie;
    while(cuv[poz]!='\0'&&aux!=0)
    {
        aux=aux->A[cuv[poz]+1-'a'];
        if(aux!=0)
            if(cuv[poz+1]=='\0')
                return aux->val;
        poz++;
    }
}
int pref(char cuv[21])
{
    int poz=0;
    int maxx=0;
    TRIE *aux;
    aux=trie;
    while(cuv[poz]!='\0'&&aux!=0)
    {
        aux=aux->A[cuv[poz]+1-'a'];
        if(aux!=0)
            if(aux->pref>0)
                maxx++;
        poz++;
    }
    return maxx;
}
void citire()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    trie=new TRIE;
    int op;
    char cuv[21];
    while(scanf("%d%s",&op,&cuv)!=-1)
    {
        switch(op)
        {
            case 0:
            add(cuv);
            break;
            case 1:
            del(cuv);
            break;
            case 2:
            printf("%d\n",apar(cuv));
            break;
            case 3:
            printf("%d\n",pref(cuv));
            break;
        };
    }
    fclose(stdin);
    fclose(stdout);
}
int main()
{
    citire();
    return 0;
}