Pagini recente » Cod sursa (job #449201) | Simulare 12 | Cod sursa (job #912035) | Cod sursa (job #2657378) | Cod sursa (job #826212)
Cod sursa(job #826212)
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie{
int nr;
int nf;
trie *f[26];
trie(){
nr=0;
nf=0;
for(int i=0;i<26;i++)
f[i]=0;
}
}*r;
int op;
char cuv[50];
void add(unsigned int i , trie *p){
if(i==strlen(cuv)){
p->nr++;
return;
}
int val=cuv[i]-'a';
if(p->f[val]==0){
trie *c;
c=new trie;
p->f[val]=c;
p->nf++;
}
add(i+1,p->f[val]);
}
void del(unsigned int i, trie *p){
if(i==strlen(cuv)){
p->nr--;
return;
}
int val=cuv[i]-'a';
del(i+1,p->f[val]);
if(p->f[val]->nr==0&&p->f[val]->nf==0){
p->nf--;
delete p->f[val];
p->f[val]=0;
}
}
int nr_ap(unsigned int i,trie *p){
if(i==strlen(cuv))
return p->nr;
int val=cuv[i]-'a';
if(p->f[val]==0)
return 0;
return nr_ap(i+1,p->f[val]);
}
int pre(unsigned int i , trie *p,int lungime){
if(i==strlen(cuv))
return lungime;
if(p->nr!=0||p->nf!=0)
lungime=i;
int val=cuv[i]-'a';
if(p->f[val]==0)
return lungime;
return pre(i+1,p->f[val],lungime);
}
int main(){
r=new trie;
while(!f.eof()){
f>>op>>cuv;
if(op==0)
add(0,r);
else{
if(op==1)
del(0,r);
else{
if(op==2)
g<<nr_ap(0,r)<<"\n";
else
g<<pre(0,r,0)<<"\n";
}
}
}
return 0;
}