Cod sursa(job #759389)

Utilizator ion824Ion Ureche ion824 Data 17 iunie 2012 21:09:31
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;

struct nod{
    struct nod*f[26];
    int viz,cuv;
}*t;

char s[33];

void add(char *s){
    nod *g=t;
    int urm;
    while(isalpha(*s))
    {
        urm=*s-'a';
        if(g->f[urm]==0)g->f[urm]=new nod;
        g=g->f[urm];
        g->viz++;
        s++; //trecem la urmatorul caracter din cuvint
    }
        g->cuv++;
}

void remove(char *s){
    nod *g=t;
    int urm;
    while(isalpha(*s))
    {
        urm=*s-'a';
        g=g->f[urm];
        g->viz--;
        s++;
    }
        g->cuv--;
}

int aparitii(char *s){
    nod *g=t;
    int urm;
    while(isalpha(*s))
    {
        urm=*s-'a';
        if(g->f[urm]==0)return 0;
        g=g->f[urm];
        s++;
    }
        return g->cuv;
}

int prefix(char *s){
    nod *g=t;
    int l=0,p=0,urm;
    while(isalpha(*s))
    {
        urm=*s-'a';
        if(g->f[urm]==0)break;
        g=g->f[urm];
        s++;
        p++;
        if(g->viz>0)l=p;
    }
    return l;
}

int main(){
    int c;
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    t=new nod;
        while(scanf("%d %s ",&c,s)!=-1)
        {
            switch(c){
                case 0: add(s); break;
                case 1: remove(s); break;
                case 2: printf("%d\n",aparitii(s)); break;
                case 3: printf("%d\n",prefix(s)); break;
            }
        }
    return 0;
}