Pagini recente » Cod sursa (job #2505348) | Cod sursa (job #901523) | Cod sursa (job #1462822) | Cod sursa (job #411654) | Cod sursa (job #751060)
Cod sursa(job #751060)
#include<iostream>
#include<fstream>
#include<cstring>
#include<cstdio>
#define ch ( *lit-'a' )
using namespace std;
struct Trie{
int nrcuv;
int nrfii;
Trie *fiu[27];
Trie(){
nrcuv=0;
nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T=new Trie;
void insereaza(Trie *cuv, char *lit){
if(*lit=='\n'){
cuv->nrcuv++;
return;
}
if(cuv->fiu[ch]==0){
cuv->fiu[ch]=new Trie;
cuv->nrfii++;
}
insereaza(cuv->fiu[ch],lit+1);
}
int sterge(Trie *cuv,char *lit){
if(*lit=='\n')
cuv->nrcuv--;
else
if(sterge(cuv->fiu[ch],lit+1)){
cuv->fiu[ch]=0;
cuv->nrfii--;
}
if(cuv!=T && cuv->nrcuv==0 && cuv->nrfii==0){
delete cuv;
return 1;
}
return 0;
}
int nr_cuvinte(Trie *cuv,char *lit){
if(*lit=='\n')
return cuv->nrcuv;
return nr_cuvinte(cuv->fiu[ch],lit+1);
return 0;
}
int prefix(Trie *cuv,char *lit,int k){
if(*lit=='\n' || !cuv->fiu[ch])
return k;
return prefix(cuv->fiu[ch],lit+1,k+1);
}
int main(){
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int r;
char line[32];
fgets(line, 32, stdin);
while(!feof(stdin)){
switch(line[0]){
case '0': insereaza(T, line+2); break;
case '1': sterge(T, line+2); break;
case '2': r = nr_cuvinte(T, line+2), printf("%d\n", r); break;
case '3': r = prefix(T, line+2, 0), printf("%d\n", r); break;
}
fgets(line, 32, stdin);
}
return 0;
}