Pagini recente » onisim2009-7 | Istoria paginii utilizator/georgiana_m | Cod sursa (job #340749) | Cod sursa (job #882714) | Cod sursa (job #1521818)
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <cstring>
#define x first
#define y second
#define ch (*s-'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int c,n,m,i,j,ok,maxi=0,mini=2000000000,x,k,y,a,b,op;
char s[100];
struct Trie{
Trie *fii[26];char cc;
int nrfii,cuv;
Trie()
{
nrfii=0;cuv=0;
memset(fii,0,sizeof(fii));
}
} *t;
void ins(Trie *nod,char *s)
{
if(nod->fii[ch]==0)
{
nod->nrfii++;
nod->fii[ch]=new Trie;
nod->fii[ch]->cc=*s;
}
if(!*(s+1))
{
nod->fii[ch]->cuv++;
}
else
ins(nod->fii[ch],s+1);
}
int del(Trie *nod,char *s)
{
if(*(s))
{
if(del(nod->fii[ch],s+1))
{
delete nod->fii[ch];
nod->fii[ch]=0;
nod->nrfii--;
return nod->nrfii == 0 && nod->cuv == 0;
}
else
return 0;
}
else
{
if(nod->cuv)
{
nod->cuv--;
if(!nod->cuv&&!nod->nrfii)
{
return 1;
}
else
return 0;
}
}
}
int q(Trie *nod,char *s)
{
if(*(s))
return q(nod->fii[ch],s+1);
if(nod->fii[ch]!=0)
return nod->cuv;
return 0;
}
int pref(Trie *nod,char *s,int k)
{
if(!*(s))
return k;
if(nod->fii[ch]!=0)
return pref(nod->fii[ch],s+1,k+1);
else
return k;
}
int main()
{
t=new Trie;
while(fin>>op)
{
fin>>s;
switch(op)
{
case 0: ins(t,s); break;
case 1: del(t,s); break;
case 2: fout<<q(t,s)<<'\n'; break;
case 3: fout<<pref(t,s,0)<<'\n'; break;
}
}
return 0;
}