Pagini recente » Cod sursa (job #1176535) | Cod sursa (job #92933) | Cod sursa (job #1874663) | Cod sursa (job #1943340) | Cod sursa (job #1116531)
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
FILE *f = fopen("trie.in","r");
FILE *g = fopen("trie.out","w");
#define poz (*s - 'a')
struct Node {
int nrCuv;
int nrChildren;
Node *Children[ 26 ];
};
class Trie {
public:
Node *root;
Trie() {
root = new Node;
root->nrCuv = 0;
root->nrChildren = 0;
}
void addWord ( Node *p, char *s ) {
if ( *s == '\n' ) {
p->nrCuv++;
return;
}
if ( p->Children[ poz ] == NULL ) {
p->Children[ poz ] = new Node;
p->Children[ poz ]->nrCuv = 0;
p->nrChildren++;
p->Children[ poz ]->nrChildren = 0;
}
addWord( p->Children[ poz ], s + 1 );
}
int deleteWord ( Node *p, char *s ) {
if ( *s == '\n' ) {
p->nrCuv--;
}
else {
if ( deleteWord( p->Children[ poz ], s + 1 ) ) {
p->Children[ poz ] = NULL;
p->nrChildren--;
}
}
if ( p->nrCuv == 0 && p->nrChildren == 0 && p != root ) {
delete p;
return 1;
}
return 0;
}
int printApp ( Node *p, char *s ) {
if ( *s == '\n' ) {
return p->nrCuv;
}
if ( p->Children[ poz ] != NULL ) {
return printApp( p->Children[ poz ], s + 1 );
}
return 0;
}
int longestPrefix ( Node *p, char *s, int k ) {
if ( *s == '\n' || p->Children[ poz ] == NULL ) {
return k;
}
return longestPrefix ( p->Children[ poz ], s + 1, k + 1 );
}
};
int main() {
Trie T;
char line[ 32 ];
fgets( line, 32, f );
Node *p = new Node();
p = T.root;
while( !feof( f ) ) {
switch( line[0] ) {
case '0': T.addWord( p, line+2 ); break;
case '1': T.deleteWord( p, line+2 ); break;
case '2': fprintf(g, "%d\n", T.printApp( p, line + 2 ) ); break;
case '3': fprintf(g, "%d\n", T.longestPrefix( p, line + 2, 0 ) ); break;
}
fgets( line, 32, f );
}
return 0;
}