Pagini recente » Cod sursa (job #373089) | Cod sursa (job #1304479) | Cod sursa (job #1293717) | Cod sursa (job #2810263) | Cod sursa (job #1184772)
#include<fstream>
#include<string>
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
const int sigma = 26;
struct TRIE{
int aparitii;
int nr_fii;
TRIE *fiu[sigma];
TRIE(){
aparitii=0;
nr_fii=0;
for(int i=0;i<sigma;i++) fiu[i]=NULL;
};
};
TRIE *root = new TRIE;
string s;
int oper;
void insert_TRIE(TRIE *nod,int poz){
int c = s[poz]-'a';
if(s[poz]=='\0') nod->aparitii++;
else{
if(nod->fiu[c]==NULL){ nod->fiu[c]=new TRIE; nod->nr_fii++; }
insert_TRIE(nod->fiu[c],poz+1);
}
}
bool delete_TRIE(TRIE *nod,int poz){
int c = s[poz]-'a';
if(s[poz]=='\0') nod->aparitii--;
else if(delete_TRIE(nod->fiu[c],poz+1)){
nod->fiu[c]=NULL;
nod->nr_fii--;
}
if(nod->aparitii==0 && nod->nr_fii==0 && nod!=root){ delete nod; return 1; }
return 0;
}
int query_TRIE(TRIE *nod,int poz){
int c = s[poz]-'a';
if(s[poz]=='\0') return nod->aparitii;
if(nod->fiu[c]==NULL) return 0;
return query_TRIE(nod->fiu[c],poz+1);
}
int prefix_TRIE(TRIE *nod,int poz){
int c = s[poz]-'a';
if(s[poz]=='\0' || nod->fiu[c]==NULL) return poz;
return prefix_TRIE(nod->fiu[c],poz+1);
}
int main(){
while(fi>>oper>>s){
if(oper==0) insert_TRIE(root,0);
else if(oper==1) delete_TRIE(root,0);
else if(oper==2) fo<<query_TRIE(root,0)<<"\n";
else if(oper==3) fo<<prefix_TRIE(root,0)<<"\n";
}
fi.close();
fo.close();
return 0;
}