Cod sursa(job #1697937)

Utilizator daneel95Holteiu Daniel-Ninel daneel95 Data 3 mai 2016 12:39:21
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <string.h>
#define cuv(x) (x-'a')

using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");

struct Trie
{
    int prefix=0;
    int cuvant=0;
    Trie *next[27];
}*T;

char s[1000];
int n;
int pref;

void ins(int pos, Trie *T)
{
    if(T->next[cuv(s[pos])]==NULL)
        T->next[cuv(s[pos])]=new Trie;
    T=T->next[cuv(s[pos])];
    T->prefix++;
    if(pos==n-1)
        T->cuvant++;
    else
        ins(pos+1,T);
}

void del(int pos, Trie *T)
{
    T=T->next[cuv(s[pos])];
    T->prefix--;
    if(pos==n-1)
        T->cuvant--;
    else
        del(pos+1,T);
}

int words(int pos, Trie *T)
{
    if(T->next[cuv(s[pos])]==NULL)
        return 0;
    T=T->next[cuv(s[pos])];
    if(pos==n-1)
        return T->cuvant;
    else
        return words(pos+1,T);
}

void maxPrefix(int pos, Trie *T)
{
    if(T->next[cuv(s[pos])]==NULL)
        return;
    T=T->next[cuv(s[pos])];
    if(T->prefix>=1)
        pref++;
    if(pos!=n-1)
        maxPrefix(pos+1,T);
}

int main()
{
    T=new Trie;
    int x;
    while(in>>x>>s)
    {
        n=strlen(s);
        if(x==0)
            ins(0,T);
        else if(x==1)
            del(0,T);
        else if(x==2)
            out<<words(0,T)<<endl;
        else
        {
            pref=0;
            maxPrefix(0,T);
            out<<pref<<endl;
        }
    }
    in.close();
    out.close();
    return 0;
}