Cod sursa(job #2138548)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 21 februarie 2018 18:40:08
Problema Trie Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 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 *root,*it;
int n;
void init(node *it)
{
    for(char i=0;i<26;i++)
        it->next[i]=0;
    it->term=0;
}
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;
            init(it->next[sir[i]-'a']);
        }
        it=it->next[sir[i]-'a'];
    }
    it->term++;
}
void del(node *it,char *sir)
{
    if(*sir!=0)
    {
        del(it->next[sir[0]-'a'],sir+1);
        if(it->next[sir[0]-'a']->term==0)
        {
            int ok=0;
            for(int i=0;i<26;i++)
                if(it->next[sir[0]-'a']->next[i])
                {
                    ok=1;
                    break;
                }
            if(ok==0)
            {
                delete(it->next[sir[0]-'a']);
                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;
    init(root);
    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;
}