Cod sursa(job #875951)

Utilizator OpportunityVlad Negura Opportunity Data 10 februarie 2013 23:54:48
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <cstring>
using namespace std;
 
struct nod
{
    int cuv, found;
    nod *fiu[26];
}*T;
 
void init(nod *&T){
    T = new nod;
    T->cuv = 0;
    T->found = 0;
    for (int i=0; i<26; ++i) T->fiu[i] = NULL;
}
 
void add(char *S){
    int i, n=strlen(S);
    nod *t = T;
    for (i=0; i<n; ++i){
        if (t->fiu[S[i]-'a'] == NULL) init(t->fiu[S[i]-'a']);
        t = t->fiu[S[i]-'a'];
        ++t->cuv;
    }
    ++t->found;
}
 
void del(char *S){
    int i, n=strlen(S);
    nod *t = T;
    for (i=0; i<n; ++i){
        t = t->fiu[S[i]-'a'];
        t->cuv--;
    }
    t->found--;
}
 
int count(char *S){
    int i, n=strlen(S);
    nod *t = T;
    for (i=0; i<n; ++i){
        t = t->fiu[S[i]-'a'];
        if (t == NULL || !t->cuv) return 0;
    }
    return t->found;
}
 
int common(char *S)
{
    int i, n=strlen(S), cnt=0;
    nod *man = T;
    for (i=0; i<n && man->fiu[S[i]-'a']; ++i){
        man = man->fiu[S[i]-'a'];
        if (!man->cuv) break;
        ++cnt;
    }
    return cnt;
}
 
int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    
    int c; char S[30], *p;
    init(T);
    
    while (gets(S)){
        c = S[0]-'0';
        p = S+2;
        switch (c){
            case 0: add(p); break;
            case 1: del(p); break;
            case 2: printf("%d\n", count(p)); break;
            case 3: printf("%d\n", common(p)); break;
        }
    }
    
    return 0;
}