Cod sursa(job #1873271)

Utilizator silkMarin Dragos silk Data 8 februarie 2017 21:36:19
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <cstring>
#define NMax 26

char s[NMax+1];
char a[NMax+1];

struct trie{
    int nr;
    int cnt;
    trie * nxt[26];
    void Init(){
        for(int i = 0; i < 26; ++i) nxt[i] = NULL;
        nr = cnt = 0;
    }
};

trie* rad;

void Insert(char* cuv)
{
    int i,j;

    trie *q, *p = rad;
    for(i = 0; cuv[i]; ++i)
    {
        p->nr++;
        j = cuv[i] - 'a';
        if(!p->nxt[j])
        {
            q = new trie;
            q->Init();
            p->nxt[j] = q;
        }
        p = p->nxt[j];
    }
    p->nr++;
    p->cnt++;
}

void Delete(char* cuv)
{
    int i,j;

    trie *p = rad;
    for(i = 0; cuv[i]; ++i)
    {
        p->nr--;
        j = cuv[i] - 'a';
        p = p->nxt[j];
    }
    p->nr--;
    p->cnt--;
}

int Count(char* cuv)
{
    int i,j;

    trie *p = rad;
    for(i = 0; cuv[i]; ++i)
    {
        j = cuv[i] - 'a';
        p = p->nxt[j];
    }
    return p->cnt;
}

int Prefix(char* cuv)
{
    int i,j;

    trie *q, *p = rad;
    for(i = 0; cuv[i]; ++i)
    {
        j = cuv[i] - 'a';
        q = p->nxt[j];
        if(q==NULL || !q->nr) return i;
        p = q;
    }
    return i;
}

int main(){
    FILE* fin = fopen("trie.in","r");
    FILE* fout = fopen("trie.out","w");

    int v,i,lg;

    rad = new trie();
    rad->Init();
    while(fgets(s,NMax,fin) && !feof(fin))
    {
        v = s[0] - '0';
        lg = strlen(s);
        if(s[lg-1]=='\n') --lg;
        for(i = 2; i < lg; ++i) a[i-2] = s[i];
        a[lg-2] = '\0';

        if(v==0) Insert(a);
        else if(v==1) Delete(a);
        else if(v==2) fprintf(fout,"%d\n",Count(a));
        else fprintf(fout,"%d\n",Prefix(a));
    }

    fclose(fin);
    fclose(fout);


return 0;
}