Cod sursa(job #763545)

Utilizator test666013Testez test666013 Data 2 iulie 2012 16:14:38
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;

struct nod{
    struct nod *f[26];
    int nr,p; }*t;

void add(char *b){
    nod *g = t;
    int urm;
    while(isalpha(*b))
    {
        urm = *b - 'a';
        if(g->f[urm] == NULL) g->f[urm] = new nod;
        g = g->f[urm];
        g->p++; // adaugam o aparitie
        b++; // urmatorul caracter
    }
        g->nr++; // adaugam un cuvint nou
}

void remove(char *b){
    nod *g = t;
    int urm;
    while(isalpha(*b))
    {
        urm = *b - 'a';
        g = g->f[urm];
        g->p--; // stergem o aparitie
        b++; // urmatorul caracter
    }
        g->nr--; //stergem un cuvint
}

int number(char *b){
    nod *g = t;
    int urm;
    while(isalpha(*b))
    {
        urm = *b - 'a';
        if(g->f[urm] == NULL) return 0;
        g = g->f[urm];
        b++; // urmatorul caracter
    }
        return g->nr;
}

int prefix(char *b){
    nod *g = t;
    int urm, l = 0;
    while(isalpha(*b))
    {
        urm = *b - 'a';
        if(g->f[urm] == NULL) break;
        g = g->f[urm];
        if(g->p < 1) break;
        b++; // urmatorul caracter
        l++;
    }
        return l;
}

int main(){
    int c;
    char a[30];
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    t = new nod; // cream structura trie.

    while(scanf("%d %s ",&c,a)!=-1)
    {
        switch(c){
            case 0: add(a); break;
            case 1: remove(a); break;
            case 2: printf("%d\n",number(a)); break;
            case 3: printf("%d\n",prefix(a)); break;
        }
    }
    return 0;
}