Cod sursa(job #2138563)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 21 februarie 2018 18:50:00
Problema Trie Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct node{
    int term;
    node* next[26];
    node()
    {
        memset(next,0,sizeof(next));
        term=0;
    }
};
node *root,*it;
int n;

void add(char *sir)
{
    n=strlen(sir);
    for(int i=0;i<n;i++)
    {
        if(!it->next[sir[i]-'a'])
        {
            it->next[sir[i]-'a']=new node;
        }
        it=it->next[sir[i]-'a'];
    }
    it->term++;
}
void del(node *it,char *sir)
{
    node* aux;
    if(*sir!=0)
    {
        aux=it->next[sir[0]-'a'];
        del(aux,sir+1);
        if(aux->term==0)
        {
            for(int i=0;i<26;i++)
                if(aux->next[i])
                    return ;
            delete(aux);
            it->next[sir[0]-'a']=0;
        }
    }
    else it->term--;
}
int apar(char *sir)
{
    n=strlen(sir);
    for(int i=0;i<n;i++)
    {
        if(it->next[sir[i]-'a'])
            it=it->next[sir[i]-'a'];
        else return 0;
    }
    return it->term;
}
int prefix(char *sir)
{
    n=strlen(sir);
    int i;
    for(i=0;i<n;i++)
    {
        if(it->next[sir[i]-'a'])
            it=it->next[sir[i]-'a'];
        else
            return i;
    }
    return n;
}
int main()
{
    int op;
    char sir[25];
    root=new node;
    while(f>>op)
    {
        f>>sir;
        it=root;
        if(op==0)
            add(sir);
        if(op==1)
            del(root,sir);
        if(op==2)
            g<<apar(sir)<<'\n';
        if(op==3)
            g<<prefix(sir)<<'\n';
    }
    return 0;
}