Pagini recente » Cod sursa (job #1826271) | Cod sursa (job #1151156) | Cod sursa (job #1645467) | Cod sursa (job #2621814) | Cod sursa (job #641513)
Cod sursa(job #641513)
#include<fstream>
using namespace std;
struct trie{int inf,nrf;
trie* fiu[26];
};
trie *T=new trie;
void set_new_trie(trie *nod) {
nod->inf=nod->nrf=0;
for(int i=0;i<26;nod->fiu[i++]=0);
}
int prefix(trie *nod,char *p) {
int k=0;
while(*p) {
if(nod->fiu[*p-'a']) {
nod=nod->fiu[*p-'a'];
p++;
}
else
break;
k++;
}
return k;
}
int count(trie *nod,char *p) {
while(*p) {
if(nod->fiu[*p-'a']) {
nod=nod->fiu[*p-'a'];
p++;
}
else
return 0;
}
return nod->inf;
}
void del(trie *nod,char *p) {
if(!*p)
nod->inf--;
else {
del(nod->fiu[*p-'a'],p+1);
if(nod->fiu[*p-'a']->inf==0&&nod->fiu[*p-'a']->nrf==0&&nod->fiu[*p-'a']!=T) {
delete nod->fiu[*p-'a'];
nod->fiu[*p-'a']=0;
nod->nrf--;
}
}
}
void add(trie *nod,char *p) {
while(*p) {
if(nod->fiu[*p-'a']==0) {
nod->fiu[*p-'a']=new trie;
set_new_trie(nod->fiu[*p-'a']);
nod->nrf++;
}
nod=nod->fiu[*p-'a'];
p++;
}
nod->inf++;
}
int main() {
char line[25]="55";
set_new_trie(T);
ifstream in("trie.in");
ofstream out("trie.out");
while(!in.eof()) {
switch(line[0]) {
case '0':add(T,line+2);break;
case '1':del(T,line+2);break;
case '2':out<<count(T,line+2)<<'\n';break;
case '3':out<<prefix(T,line+2)<<'\n';break;
}
in.getline(line,24);
}
in.close();
out.close();
return 0;
}