Cod sursa(job #2041529)

Utilizator KOzarmOvidiu Badea KOzarm Data 17 octombrie 2017 15:24:34
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <cstring>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie
{
    trie *next[30];
    int aparitie;
    int treceri;
}*d,*p;

char x[22];
int n,ttl;

void adauga(int poz, int n,int val)
{
    if(p->next[x[poz]-'a']==0)
    {
        trie *s=new trie;
        s->aparitie=0;
        for(int i=0;i<30;i++)
            s->next[i]=0;
        p->next[x[poz]-'a']=s;
        p=s;
    }
    else
        p=p->next[x[poz]-'a'];
    p->treceri+=val;
    if(poz<n-1)
        adauga(poz+1,n,val);
    else
        p->aparitie+=val;
}

void afiseaza(int poz,int n)
{
    if(p->next[x[poz]-'a']==0)
    {
        fout<<"0\n";
        return;
    }
    else
        p=p->next[x[poz]-'a'];
    if(poz<n-1)
        afiseaza(poz+1,n);
    else
    {
        fout<<p->aparitie<<"\n";
        return;
    }
}

void prefix(int poz,int n)
{
    if(p->next[x[poz]-'a']==0)
        return;
    else
        p=p->next[x[poz]-'a'];

    if(p->treceri>0)
        ttl=poz+1;

    if(poz<n-1)
        prefix(poz+1,n);
    else
        return;
}


int main()
{
    d=new trie;
    d->aparitie=0;
    for(int i=0;i<30;i++)
            d->next[i]=0;
    while(fin>>n)
    {
        fin>>x;
        int qwert=strlen(x);
        int i=0;
        p=d;
        if(n==0)
            adauga(i,qwert,1);
        else
        if(n==1)
            adauga(i,qwert,-1);
        else
        if(n==2)
            afiseaza(i,qwert);
        else
        if(n==3)
        {
            ttl=0;
            prefix(i,qwert);
            fout<<ttl<<"\n";
        }
    }
    return 0;
}