Cod sursa(job #2138574)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 21 februarie 2018 18:59:35
Problema Trie Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct node{
    int term,cuv;
    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->term++;
        }
        it=it->next[sir[i]-'a'];
    }
    it->cuv++;
}
bool del(node *it,char *sir)
{
    if(*sir==0)
    {
        it->cuv--;
        if(it->cuv==0 && it->term==0)
        {
            delete(it);
            return 1;
        }
        return 0;
    }
    if(del(it->next[*sir-'a'],sir+1)==1)
    {
        it->next[*sir-'a']=0;
        it->term--;
        if(it->cuv==0 && it->term==0 && it!=root)
        {
            delete(it);
            return 1;
        }
        return 0;
    }
}
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->cuv;
}
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;
}