Cod sursa(job #2137362)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 20 februarie 2018 19:09:48
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 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;
void init(node *it)
{
    for(int i=0;i<26;i++)
        it->next[i]=0;
    it->term=0;
}
void add(char *sir)
{
    int n=strlen(sir);
    node *it;
    it=root;
    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->term++;
        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);
    }
    it->term--;
}
int apar(char *sir)
{
    int n=strlen(sir);
    node *it=root;
    for(int i=0;i<n;i++)
    {
        if(it->next[sir[i]-'a'])
            it=it->next[sir[i]-'a'];
        else return 0;
    }
    int rez=it->term,i;
    for(i=0;i<26;i++)
        if(it->next[i])
            rez-=it->next[i]->term;
    return rez;
}
int prefix(char *sir)
{
    node *it=root;
    int nr,n=strlen(sir),maxim=0,i;
    for(i=0;i<n;i++)
    {
        if(it->term==0)
            return i-1;
        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;
        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;
}