poj 2001 Trie树

题意思路简单,直接贴代码

/*
* poj2001/win.c
* Created on: 2011-8-18
* Author : ben
*/
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<math.h>

#define MAXN 1005
#define MAXLEN 25

int N;
char strs[MAXN][MAXLEN];

typedef
struct Trie {
int num;
struct Trie * br[26];
} Trie;

Trie
* newTrieNode() {
int i;
Trie
* node = (Trie *) malloc(sizeof(Trie));
for (i = 0; i < 26; i++) {
node
->br[i] = NULL;
}
node
->num = 0;
return node;
}

void insert(Trie *root, char *str, int len) {
int i;
if (len <= 0) {
root
->num = 1;
return;
}
i
= (*str) - 'a';
if (!root->br[i]) {
root
->br[i] = newTrieNode();
}
insert(root
->br[i], str + 1, len - 1);
}

void count(Trie *root) {
int i;
for (i = 0; i < 26; i++) {
if (root->br[i]) {
count(root
->br[i]);
root
->num += root->br[i]->num;
}
}
}

void destroy(Trie *root) {
int i;
for (i = 0; i < 26; i++) {
if (root->br[i] != NULL) {
destroy(root
->br[i]);
}
}
free(root);
}

void putprefix(Trie *root, char *str, int len) {
int i;
if(len < 1 || root->num <= 1) {
return ;
}
putchar(
*str);
i
= (*str) - 'a';
putprefix(root
->br[i], str + 1, len - 1);
}

void work() {
Trie
*root = newTrieNode();
int len, i;
N
= 0;
while (scanf("%s", strs[N]) != EOF) {
N
++;
}
for(i = 0; i < N; i++) {
len
= strlen(strs[i]);
insert(root, strs[i], len);
}
count(root);
for(i = 0; i < N; i++) {
printf(
"%s ", strs[i]);
putprefix(root, strs[i], strlen(strs[i]));
putchar(
'\n');
}
destroy(root);
}

int main() {
#ifndef ONLINE_JUDGE
freopen(
"data.in", "r", stdin);
#endif
work();
return 0;
}
posted @ 2011-08-18 17:22  moonbay  阅读(232)  评论(0编辑  收藏  举报