Cod sursa(job #1326331)

Utilizator DjokValeriu Motroi Djok Data 25 ianuarie 2015 10:45:20
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<fstream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;

typedef struct ttrie {
        int nr,cuv;
        ttrie *a[30];
        ttrie() { memset(a,0,sizeof(a)); nr=cuv=0; }
        }*trie;

int i,op,n;
trie root;
string s;

void Insert() {
     int i;
     trie aux=root;

     for(i=0;i<s.length();++i)
     {
       if(!aux->a[s[i]-'a']) aux->a[s[i]-'a']=new ttrie;
       aux=aux->a[s[i]-'a']; ++aux->nr;
     }
     ++aux->cuv;
}

void Delete() {
     int i;
     trie aux=root;

     for(i=0;i<s.length();++i)
     aux=aux->a[s[i]-'a'],--aux->nr;

     --aux->cuv;
}

int Query() {
    int i;
    trie aux=root;

    for(i=0;i<s.length();++i)
    {
      if(!aux->a[s[i]-'a']) return 0;
      aux=aux->a[s[i]-'a'];
    }
    return aux->cuv;
}

int Prefix() {
    int i,rs=0;
    trie aux=root;
    for(i=0;i<s.length();++i)
    {
      if(!aux->a[s[i]-'a']) return rs;
      aux=aux->a[s[i]-'a'];
      if(!aux->nr) return rs;
      ++rs;
    }
    return rs;
}

int main()
{
  ifstream cin("trie.in");
  ofstream cout("trie.out");

  getline(cin,s); root=new ttrie;
  op=s[0]-'0'; s.erase(0,2); n=s.length();

  while(n)
  {
    if(!op) Insert();
    if(op==1) Delete();
    if(op==2) cout<<Query()<<'\n';
    if(op==3) cout<<Prefix()<<'\n';
    
    getline(cin,s); n=s.length();
    if(n) op=s[0]-'0',s.erase(0,2),n-=2;
  }

 return 0;
}