Pagini recente » Cod sursa (job #2199422) | Cod sursa (job #185689) | Cod sursa (job #50037) | Cod sursa (job #1538998) | Cod sursa (job #1905226)
#include <fstream>
#include <string>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
typedef struct nod{
int terminal;
int nrcuv;//nr cuvintelor care trec prin nod
struct nod *fiu[26];
}*TRIE, NOD;
TRIE T;
char CUV[21];
void add(TRIE &T, char *p){
int i;
if(T==NULL){
T = new NOD;
T->terminal = 0;
T->nrcuv = 0;
for( i = 0; i < 26; i++)
T->fiu[i] = NULL;
add(T,p);
}
else if( (*p) == '\0'){
T->terminal++;
T->nrcuv++;
}
else{
T->nrcuv++;
add(T->fiu[*(p)-'a'],p+1);
}
}
void del(TRIE &T, char *p){
if( (*p) == '\0' ){
if( T->nrcuv > 1 ){
T->terminal--;
T->nrcuv--;
}
else
delete(T);
}
else{
del(T->fiu[(*p) - 'a'],p+1);
if( T->nrcuv == 1 ){
delete(T);
T = NULL;
}
else{
T->nrcuv--;
}
}
}
int nr_ap(TRIE T, char *p){
if( (*p) == '\0')
return T->terminal;
if( T->fiu[(*p)-'a'] == NULL )
return 0;
else
return nr_ap(T->fiu[(*p)-'a'],p+1);
}
int prefix(TRIE T, char *p){
if((*p) == '\0' || T->fiu[(*p)-'a'] == NULL )
return 0;
return 1 + prefix(T->fiu[(*p)-'a'],p+1);
}
/*void afis(TRIE T,int k){// afisare trie
if(T != NULL){
int i;
if(T->terminal > 0){
CUV[k] = '\0';
g << CUV << endl;
}
else{
for(i = 0; i < 26; i++)
if( T->fiu[i] != NULL ){
CUV[k] = char('a'+i);
afis(T->fiu[i],k+1);
CUV[k] = '\0';
}
}
}
}*/
int main(){
int v;
f >> v >> CUV;
while(!f.eof()){
switch(v){
case 0:
add(T,CUV);
break;
case 1:
del(T,CUV);
break;
case 2:
g << nr_ap(T,CUV);
break;
case 3:
g << prefix(T,CUV);
break;
}
f >> v >> CUV;
}
return 0;
}