考查Trie树,用G++提交会超内存,原因不详,C++提交AC
// Tire树
// 用G++提交会超内存,具体原因不详
// 用C++提交AC
#include <cstdio>
#include <string>
#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
typedef struct node {
struct node* next[26];
int num;
bool isLeaf;
node() {
for( int i = 0; i < 26; i++ ) {
next[i] = NULL;
}
num = 0;
isLeaf = true;
}
} Node;
int Max = 0;
Node* createTrie() {
Node* root = ( Node* )malloc( sizeof( Node ) );
for( int i = 0; i < 26; i++ ) {
root->next[i] = NULL;
}
root->num = 0;
root->isLeaf = true;
return root;
}
void insert( Node* root, char str[] ) {
Node* r = root;
for( int i = 0; i < strlen( str ); i++ ) {
if( r->next[str[i] - 'a'] == NULL ) {
Node* p = createTrie();
//r->next[str[i] - 'a'] = new Node;
r->next[str[i] - 'a'] = p;
r->isLeaf = false;
}
r = r->next[str[i] - 'a'];
r->num++;
}
r->isLeaf = true;
}
int find( Node* root, char str[] ) {
Node* r = root;
for( int i = 0; i < strlen( str ); i++ ) {
if( r->next[str[i] - 'a'] == NULL ) return 0;
r = r->next[str[i] - 'a'];
}
return r->num;
}
void deleteTrie( Node* root ) {
for( int i = 0; i < 26; i++ ) {
if( root->next[i] ) {
deleteTrie( root->next[i] );
}
}
free( root );
}
int main() {
Node* root = createTrie();
//Node* root = new Node;
char str[15];
while( gets( str ) ) {
if( strlen( str ) == 0 ) break;
insert( root, str );
}
while( gets( str ) ) {
printf( "%d\n", find( root, str ) );
}
deleteTrie( root );
return 0;
}