tyvj 1228:
字典树。
#include <stdio.h>
#include <string.h>
struct node
{
char *s;
bool f;//单词结束的标志
node *next[26];
node()
{
int i;
for(i = 0; i < 26; i++)
next[i] = NULL;
f = 0;
}
};
void build(node *head, char str[])
{
node *temp = head;
int i, len = strlen(str), j;
for(i = 0; i < len; i ++)
{
int t = str[i] - 'a';
if(temp->next[t] == NULL)
{
node *e = new node;
//for(j = 0; j <= i; j++)
// e->s[j] = str[j];
//e->s[j] = '\0';
temp->next[t] = e;
}
temp = temp->next[t];
}
//单词读入结束,将整个单词放入s指向的数组中
//方便输出,也比较省内存
temp->f = 1;
temp->s = new char[25];
strcpy(temp->s, str);
}
int flag;
void search(node *temp)
{
int i;
if(flag >= 8)
return;
if(temp ->f == 1)
{
if(flag == 0)
printf("%s", temp->s);
else
printf(" %s", temp->s);
flag ++;
}
for(i = 0; i < 26; i++)
if(temp->next[i] != NULL)
search(temp->next[i]);
return ;
}
/*
比较麻烦的输出字典树
char xx[25];
void dfs(node *temp, int len)
{
int i;
if(temp->f == 1)
{
xx[len] = '\0';
printf("%s\n", xx);
}
for(i = 0; i < 26; i++)
{
if(temp->next[i] != NULL)
{
xx[len] = i + 'a';
dfs(temp->next[i], len + 1);
}
}
}
*/
void dfs(node *temp, int len)
{//输出字典树中的单词
int i;
if(temp->f == 1)
printf("%s\n", temp->s);
for(i = 0; i < 26; i++)
if(temp->next[i] != NULL)
dfs(temp->next[i], len + 1);
}
int main (void)
{
int n;
scanf("%d", &n);
node *head = new node;
char str[25];
int i;
for(i = 0; i < n; i++)
{
scanf("%s", str);
build(head, str);
}
//dfs(head, 0);
scanf("%d", &n);
while(n --)
{
flag = 0;
scanf("%s", str);
int len = strlen(str);
node *temp = head;
for(i = 0; i < len; i++)
{
if(temp ->next[str[i] - 'a'] != NULL)
temp = temp ->next[str[i] - 'a'];
else
{//不存在以输入单词为前缀的单词
printf("%s\n", str);
flag = 1;
break;
}
}
if(flag == 0)
{
search(temp);
printf("\n");
}
}
return 0;
}