Pagini recente » Cod sursa (job #1928510) | Cod sursa (job #2631195) | Cod sursa (job #2656407) | Cod sursa (job #573981) | Cod sursa (job #1842211)
#include<iostream>
#include<fstream>
using namespace std;
struct Trie{
int Many,Pass;
Trie * Sons[26];
Trie(){
Pass=Many=0;
for(int i=0;i<26;i++) Sons[i]=NULL;
}
} *root;
Trie* ins(Trie *n, char *s){
if(n==NULL) n=new Trie();
if(*(s) != '\0'){
n->Sons[*s-'a'] = ins(n->Sons[*s-'a'],s+1);
}
else{
n->Many++;
}
n->Pass++;
return n;
}
Trie* rem(Trie *n, char *s){
if(*(s) != '\0'){
n->Sons[*s-'a'] = rem(n->Sons[*s-'a'],s+1);
}
else{
n->Many--;
}
n->Pass--;
if(n->Pass==0){
delete n;
return NULL;
}
return n;
}
int ap(Trie *n, char *s){
if(n==NULL) return 0;
if(*(s) != '\0'){
return ap(n->Sons[*s-'a'],s+1);
}
return n->Many;
}
int lun(Trie *n, char *s){
if(n==NULL){
return -1;
}
if(*(s) != '\0'){
return 1 + lun(n->Sons[*s-'a'],s+1);
}
return 0;
}
int n,t;
char s[30];
int main(){
ifstream in("trie.in");
ofstream out("trie.out");
while(!in.eof()){
in>>t;
if(in.eof()) return 0;
in.get();
if(in.eof()) return 0;
in.getline(s,30);
if(in.eof()) return 0;
if(t==0) root = ins(root,s);
if(t==1) root = rem(root,s);
if(t==2) out<< ap(root,s) <<'\n';
if(t==3) out<< max(0,lun(root,s)) <<'\n';
}
return 0;
}