Pagini recente » Cod sursa (job #10410) | Cod sursa (job #3041833) | Cod sursa (job #286402) | Cod sursa (job #2097411) | Cod sursa (job #306013)
Cod sursa(job #306013)
#include<stdio.h>
#include<string.h>
using namespace std;
struct trie
{ int cnt;int son;
trie *sons[26];
trie(){cnt=son=0;memset(sons,0,sizeof(sons));}
};
trie *root=new trie;
void add(trie *nod, char *s)
{ if(*s=='\n') { ++nod->cnt;return;}
if(nod->sons[ (*s-'a') ]==0) { nod->sons[ (*s-'a') ]=new trie;
}
++nod->son;
add(nod->sons[ (*s-'a') ],s+1);
}
int del(trie *nod,char *s)
{ if(*s=='\n') --nod->cnt;
else if(del(nod->sons[ (*s-'a') ],s+1)){ nod->sons[ (*s-'a') ]=0;
--nod->son;
}
if(nod->cnt==0&&nod->son==0&&nod!=root) { delete nod;return 1;}
return 0;
}
int que(trie *nod,char *s)
{ if(*s=='\n') return nod->cnt;
if(nod->sons[ (*s-'a') ]) return que(nod->sons[ (*s-'a') ],s+1);
return 0;
}
int pre(trie *nod,char *s,int ord)
{ if(*s=='\n'||nod->sons[ (*s-'a') ]==0) return ord;
return pre(nod->sons[ (*s-'a') ],s+1,ord+1);
}
char a[40];
int main()
{ freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(a,sizeof(a),stdin);
while(!feof(stdin)){
if(a[0]=='0') add(root,a+2);
else if(a[0]=='1') del(root,a+2);
else if(a[0]=='2') printf("%d\n",que(root,a+2));
else printf("%d\n",pre(root,a+2,0));
fgets(a,sizeof(a),stdin);
}
fclose(stdin);
fclose(stdout);
return 0;
}