Pagini recente » Cod sursa (job #2648176) | Cod sursa (job #1604059) | Cod sursa (job #1141648) | Cod sursa (job #1267883) | Cod sursa (job #867924)
Cod sursa(job #867924)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie{
int nrfii;
int contor;
Trie *fiu[26];
};
Trie *T = new Trie;
void adauga(Trie *nod , char *s){
if(*s == '\n'){
nod->contor++;
return ;
}
if(nod->fiu[*s - 'a'] == 0){
nod->fiu[*s - 'a'] = new Trie;
nod->nrfii++;
}
adauga(nod->fiu[*s-'a'], s+1);
}
inline int sterge(Trie *nod, char *s){
if(*s == '\n')
nod->contor--;
else
if( sterge(nod->fiu[*s - 'a'], s+1) ){
nod->fiu[*s - 'a'] = 0;
nod->nrfii--;
}
if(nod->contor == 0 && nod->nrfii == 0 && nod != T){
delete nod;
return 1;
}
return 0;
}
inline int aparitii(Trie *nod, char *s){
if(*s == '\n')
return nod->contor;
if(nod->fiu[*s - 'a'])
return aparitii(nod->fiu[*s - 'a'], s+1);
return 0;
}
inline int lungime(Trie *nod, char *s, int nr){
if(*s == '\n' || nod->fiu[*s - 'a'] == 0)
return nr;
return lungime(nod->fiu[*s-'a'], s+1, nr+1);
}
void rezolva(){
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
char s[32];
fgets(s, 32, stdin);
while( feof(stdin) ){
switch(s[0]){
case '0': adauga(T, s+2); break;
case '1': sterge(T, s+2); break;
case '2': printf("%d\n", aparitii(T, s+2)); break;
case '3': printf("%d\n", lungime(T, s+2, 0)); break;
}
fgets(s, 32, stdin);
}
}
int main(){
rezolva();
return 0;
}