zoj 1899 || poj 2418 Hardwood Species(Trie~)

字典树~!

 

之前写过一个纯比较的。。。看poj讨论版貌似应该可以过,但是一直WA = =。。。

 

昨天写了个字典树,找字典树的题,实在是没有其他的了,只好做这个吧。

 

这个树很好建,不繁,和昨天那个差不多。只不过这个包括大写还有空格,所以指针要开多点。按理来说,92够了 = =。。可是最低看到95才过。。。不晓得为嘛。。

 

这个建立字典树,结构体里面存的是这个单词的个数,建的时候到末尾字母,那个结构体的单词个数加一。

 

然后前序遍历,将遇到的字母存下,直到一个存的个数不为0的节点,输出即可。

 

一次MLE,一次PE = =。。

 

这次用malloc了,发现蛮好用的,但麻烦的是需要将里面的指针初始化。。。不能用memset。。。

 

在poj上交,G++WA , C++ AC = =。。

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #define MAX 1000005 #define N 95 using namespace std; typedef struct Trie{ int num; Trie *child[N]; // biger than 'z' - ' '... }Trie; Trie *p; // the head point... int n,len; char output[35]; void init() { p = (Trie*)malloc(sizeof(Trie)); // Malloc is easy to use...I should change my mind about it...= =.. p->num = 0; for(int i=0; i<N; i++) // can't use the memset is inconvenient. p->child[i] = NULL; n = len = 0; // len to flag the output's size. } void Buildadd( char *a ) { Trie *head = p; int len; len = strlen(a); for(int i=0; i<len; i++) { int ind = a[i] - ' '; if( head->child[ind] == NULL ) { head->child[ind] = (Trie*)malloc(sizeof(Trie)); for(int k=0; k<N; k++) // this... { head->child[ind]->child[k] = NULL; head->child[ind]->num = 0; } } head = head->child[ind]; } (head->num)++; } void Pretravers( Trie *head ) // Pretraversal . { if( head->num != 0 ) { for(int i=0; i<len; i++) printf("%c",output[i]); printf(" %.4lf/n",head->num*100.0/n); } for(int i=0; i<N; i++) { if( head->child[i] != NULL ) { output[len++] = i+' '; Pretravers(head->child[i]); len--; // back tracking. } } } int main(void) { char str[35]; int flag = 0; while( gets(str) ) { init(); if( flag ) // Compared with WA,TLE,MLE,SF and so on... I love PE more... printf("/n"); else flag = 1; Buildadd(str); n++; while( gets(str) && strlen(str) ) { Buildadd(str); n++; } Trie *head = p; Pretravers( head ); } return 0; }  

 

你可能感兴趣的:(c,struct,null,output)