Pagini recente » Cod sursa (job #2827078) | Cod sursa (job #2951268) | Cod sursa (job #608543) | Cod sursa (job #452230) | Cod sursa (job #3213183)
#include <bits/stdc++.h>
#define LIT 26
using namespace std;
struct Trie{
int cnt, nrfii;
Trie *fiu[LIT];
Trie(){
cnt = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *T = new Trie;
void ins( Trie *nod, char *s ){
if(*s == '\n'){
nod -> cnt++;
return;
}
if(nod -> fiu[*s - 'a'] == 0){
nod -> fiu[*s - 'a'] = new Trie;
nod -> nrfii++;
}
ins(nod -> fiu[*s - 'a'], s + 1);
}
int del(Trie *nod, char *s){
if(*s == '\n')
nod -> cnt--;
else if(del( nod -> fiu[*s - 'a'], s + 1 )){
nod -> fiu[*s - 'a'] = 0;
nod -> nrfii--;
}
if( nod -> cnt == 0 && nod -> nrfii == 0 && nod != T){
delete nod;
return 1;
}
return 0;
}
int que(Trie *nod, char *s){
if(*s == '\n')
return nod -> cnt;
if(nod -> fiu[*s - 'a'])
return que(nod -> fiu[*s - 'a'], s + 1);
return 0;
}
int pre(Trie *nod, char *s, int k){
if(*s == '\n' || nod -> fiu[*s - 'a'] == 0)
return k;
return pre(nod -> fiu[*s - 'a'], s + 1, k + 1);
}
int main()
{
FILE *fin, *fout;
char str[23];
fin = fopen("trie.in", "r");
fout = fopen("trie.out", "w");
fgets(str, 23, fin);
while(!feof(fin)){
if(str[0] == '0')
ins(T, str + 2);
else if(str[0] == '1')
del(T, str + 2);
else if(str[0] == '2')
fprintf(fout, "%d\n", que(T, str + 2));
else
fprintf(fout, "%d\n", pre(T, str + 2, 0));
fgets(str, 23, fin);
}
fclose(fin);
fclose(fout);
return 0;
}