#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
const int maxn=100005,KIND=26;
int m;//m为建trie树所输入的单词次序
char s[30];
char s1[maxn][15];
char s2[15];
char str[15];
struct node
{
char *s;
int prefix;//表示插入单词的先后次序,即这个单词是第几次插入的.
bool isword;
node *next[KIND];//可能的最大节点数,该数组用来存26个字母
node()
{
s=NULL;
prefix=-1;
isword=false;
memset(next,0,sizeof(next));
}
}*root;//根
void insert(node *root,char *s)
{
node *p=root;
for(int i=0;s[i];i++)
{
int x=s[i]-'a';
p->s=s+i;
if(p->next[x]==NULL)
p->next[x]=new node;
p=p->next[x];
}
p->prefix=m++;
p->isword=true;
}
int search(char *s,node *root)
{
node *p=root;
for(int i=0;s[i];i++)
{
int x=s[i]-'a';
p->s=s+i;
if(p->next[x]==NULL)//按单词的节点逐个查询,如果都存在且查询到根节点,跳出循环,返回true,即p->isword
return -1;
p=p->next[x];
}
//return p->isword;
if(p->isword)//如果搜索的单词存在,则返回前缀.
return p->prefix;
return -1;
}
int main()
{
m=0;
root=new node;
while(1)
{
gets(s);
if(strcmp(s,"")==0) break;
sscanf(s,"%s%s",s1[m],s2);
s1[m][strlen(s1[m])]='\0';
s2[strlen(s2)]='\0';
insert(root,s2);
}
while(gets(str))
{
int num=search(str,root);
if(num==-1) printf("eh\n");
else puts(s1[num]);
}
return 0;
}
Babelfish trie树的基础
原文作者:Trie树
原文地址: https://blog.csdn.net/ehi11/article/details/7820306
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/ehi11/article/details/7820306
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。