Cod sursa(job #1542868)

Utilizator elevenstrArina Raileanu elevenstr Data 5 decembrie 2015 19:02:40
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct trie{
    int nr, fii;
    trie *fiu[26];
} *t;
char s[31];
bool sters;
void build(trie *nod)
{
    nod->nr =0;
    nod->fii = 0;
    for(int i=0; i<26; i++) nod->fiu[i]=0;
}
void add(trie *nod, char *p)
{
    if(*p=='\0') {nod->nr++; return;}
    int lit = *p-'a';
    if(nod->fiu[lit]==0){
        nod->fii++;
        nod->fiu[lit] = new trie;
        build(nod->fiu[lit]);
    }
    add(nod->fiu[lit], p+1);
}
void del(trie *nod, char *p)
{
    if(*p=='\0')
    {   nod->nr--;
        if(nod->nr==0&&nod->fii==0&&nod!=t)
        {
            delete nod;
            sters=1;
        }
        return;
    }
    int lit=*p-'a';
    del(nod->fiu[lit],p+1);
    if(sters)
    {   nod->fii--;
        nod->fiu[lit]=0;
        if(nod->nr==0&&nod->fii==0&&nod!=t)
        {
            delete nod;
            return;
        }
    }
    sters=0;
}
int cnt(trie *nod, char *p)
{
    if(*p=='\0')return nod->nr;
    int lit=*p-'a';
    if(nod->fiu[lit]==0)return 0;
    return cnt(nod->fiu[lit],p+1);
}
int prefix(trie *nod, char *p, int l)
{
    if(*p=='\0')return l;
    int lit=*p-'a';
    if(nod->fiu[lit]==0)return l;
    return prefix(nod->fiu[lit],p+1,l+1);
}
int main()
{
    char d;
    t = new trie;
    build(t);
    while(in.getline(s,33))
    {   d=s[0];
        if(d=='0') add(t,s+2);
        if(d=='1'){sters=0;del(t,s+2);}
        if(d=='2')out<<cnt(t,s+2)<<'\n';
        if(d=='3')out<<prefix(t,s+2,0)<<'\n';
    }
    return 0;
}