Cod sursa(job #1228647)

Utilizator george_stelianChichirim George george_stelian Data 14 septembrie 2014 21:05:30
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

struct trie
{
    int urm[26],x,nr;
}aux;
vector<trie>v;
char s[20];
int x;

void adauga_elimina(char s[20],int a)
{
    int nod=0,i;
    for(i=0;i<strlen(s);i++)
    {
        v[nod].nr+=a;
        if(v[nod].urm[s[i]-'a']==0)
        {
            v.push_back(aux);
            v[nod].urm[s[i]-'a']=v.size()-1;
            nod=v.size()-1;
        }
        else nod=v[nod].urm[s[i]-'a'];
    }
    v[nod].x+=a;
    v[nod].nr+=a;
}

int nraparitii(char s[20])
{
    int nod=0,i;
    for(i=0;i<strlen(s) && v[nod].urm[s[i]-'a'];i++) nod=v[nod].urm[s[i]-'a'];
    if(i<strlen(s)) return 0;
    else return v[nod].x;
}

int prefix(char s[20])
{
    int nod=0,i,sol=0;;
    for(i=0;i<strlen(s);i++)
    {
        if(v[nod].nr==0) break;
        sol=i;
        if(v[nod].urm[s[i]-'a']) nod=v[nod].urm[s[i]-'a'];
        else break;
    }
    return sol;
}


int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    v.push_back(aux);
    while(!feof(stdin))
    {
        scanf("%d %s\n",&x,s);
        if(x==0) adauga_elimina(s,1);
        else if(x==1) adauga_elimina(s,-1);
        else if(x==2) printf("%d\n",nraparitii(s));
        else printf("%d\n",prefix(s));
    }
    return 0;
}