Pagini recente » Cod sursa (job #1985094) | Cod sursa (job #415241) | Cod sursa (job #717428)
Cod sursa(job #717428)
#include <cstring>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct nod{
nod *v[26];
int fii;
int nr;
nod(){
fii=nr=0;
memset(v,0,sizeof(v) );
}
};
nod *T=new nod;
void adaug(nod *t,char s[21],int i){
if(i==strlen(s)){
t->nr++;
return;
}
if(t->v[s[i]-'a']==0){
t->v[s[i]-'a']=new nod;
t->fii++;
}
adaug(t->v[s[i]-'a'],s,i+1);
}
int del(nod *t,char*s){
if (*s=='\0')
t->nr--;
else
if (del(t->v[*s-'a'],s+1)){
t->v[*s-'a']=0;
t->fii --;
}
if (t->nr==0 && t->fii==0 && t!=T){
delete t; return 1;
}
return 0;
}
int query(nod *t, char *s){
if (*s=='\0')
return t->nr;
if (t->v[*s-'a'])
return query(t->v[*s-'a'],s+1);
return 0;
}
int prefix(nod *t,char *s,int i){
if (*s=='\0' || t->v[*s-'a']==0)
return i;
return prefix(t->v[*s-'a'],s+1,i+1);
}
int main ()
{
ifstream fin("trie.in");
ofstream fout("trie.out");
int op;
char c[21];
fin>>op>>c;
while(!fin.eof()){
if (op==0) adaug(T,c,0);
else if (op==1) del(T,c);
else if (op==2) fout<<query(T,c)<<endl;
else if (op==3) fout<<prefix(T,c,0)<<endl;
fin>>op>>c;
}
fin.close();
return 0;
}