Pagini recente » Cod sursa (job #2450776) | Cod sursa (job #2057923) | Cod sursa (job #1165694) | Cod sursa (job #2333861) | Cod sursa (job #1160657)
#include <iostream>
#include <cstring>
#include<fstream>
#include<cstdio>
#define l (*s - 'a')
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
class nod{
int c,nrf;
nod *f[26];
public:
nod(){
c=nrf=0;
memset(f,0,sizeof(f));
}
friend class trie;
};
class trie{
nod *r;
void inserare(nod *x,char *s){
if(*s=='\0'){
x->c++;
return;
}
if(!x->f[l]){
x->nrf++;
x->f[l]=new nod;
}
inserare(x->f[l],(s+1));
}
int sterge(nod *x,char *s){
if(*s=='\0'){
x->c--;
}
else if(sterge(x->f[l],(s+1))){
x->nrf--;
x->f[l]=0;
}
if(x->c==0 && x->nrf==0 && x!=r){
delete (x);
return 1;
}
return 0;
}
int prefix(nod *x, char *s, int k){
if(*s=='\0' || x->f[l]==0) return k;
return prefix(x->f[l], (s+1), k+1);
}
public:
trie(){
r=new nod;
}
void start_ins(char *sir){
inserare(r,sir);
}
int start_sterge(char *sir){
return sterge(r,sir);
}
/*int start_ap(char *sir){
return aparitie(r,sir);
}*/
int start_prefix(char *sir,int k){
return prefix(r,sir,k);
}
void aparitie(char *s){
nod *v;
v=r;
int i;
for(i=0;i<strlen(s);i++)
if(v->f[s[i]-'a']) v=v->f[*(s+i)-'a'];
else {
g<<"0"<<endl;
i=strlen(s)+2;
}
if(i!=strlen(s)+3) g<<v->c<<endl;
}
};
int main()
{
trie d;
char s[20];
int opt;
if(!f.eof()){
do{
f>>opt;
f>>s;
if(opt==0)d.start_ins(s);
else if(opt==1)d.start_sterge(s);
else if(opt==2)d.aparitie(s);
else g<<d.start_prefix(s,0)<<endl;
}while(!f.eof());
}
f.close();
g.close();
}