Cod sursa(job #1424692)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 25 aprilie 2015 12:55:19
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <cstring>
#include <cstdlib>
#define ab(x) (x-'a')
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct trie{
    int nr,cuv;
    trie *lit[27];
};
trie* t;
void ins(char s[],int i,int n,trie* x)
{
    if(x->lit[ ab(s[i]) ]==NULL)
        x->lit[ ab(s[i]) ]=new trie;
    x=x->lit[ ab(s[i]) ];
    x->nr++;
    if(i!=n-1)
        ins(s,i+1,n,x);
    else
        x->cuv++;
}
void del(char s[],int i,int n,trie* x)
{
    x=x->lit[ ab(s[i]) ];
    x->nr--;
    if(i!=n-1)
        del(s,i+1,n,x);
    else
        x->cuv--;
}
int cnt(char s[],int i,int n,trie* x)
{
    x=x->lit[ ab(s[i]) ];
    if(x==NULL || x->nr==0)return 0;
    else if(i==n-1)return x->cuv;
    else return cnt(s,i+1,n,x);
}
int pref;
void prefix(char s[],int i,int n,trie* x)
{
    x=x->lit[ ab(s[i]) ];
    if(x==NULL)return;
    if(i!=n-1 && x->nr > 0)
    {
        pref++;
        prefix(s,i+1,n,x);
    }
}
int main()
{
    int q,type;
    char s[1001];
    t=new trie;
    while(in>>type>>s)
    {
        if(type==0)
            ins(s,0,strlen(s),t);
        else if(type==1)
            del(s,0,strlen(s),t);
        else if(type==2)
            out<<cnt(s,0,strlen(s),t)<<'\n';
        else{
            pref=0;
            prefix(s,0,strlen(s),t);
            out<<pref<<'\n';
        }
    }
    return 0;
}