Cod sursa(job #1116625)

Utilizator octavian.grigorescuOctavian Grigorescu octavian.grigorescu Data 22 februarie 2014 18:34:19
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb

 #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 );
    } 
    fclose(f);
    fclose(g);
    return 0;
}