指针版
#include<iostream>
using namespace std;
#define max 26
struct node//初始tire树
{
bool boo;//判断是否是字符串最低端
char aa[15];//将b字符串最低端 存a字符串
node *next[max];
};
node *root;
void trie()//初始!!!!
{
root=new node;
root->boo=0;
for(int i=0;i<max;i++)
root->next[i]=NULL;
}
void insert(char a[],char b[])
{
node *p=root,*t;//将p指向当前节点,p来开辟内存
int len=strlen(b);//
for(int i=0;i<len;i++)//建立b字符串这么深得树
{
if(p->next[b[i]-'a']==NULL)
{
t=new node;
for(int j=0;j<max;j++)
t->next[j]=NULL;
t->boo=0;
p->next[b[i]-'a']=t;
}
p=p->next[b[i]-'a'];
}
p->boo=1;//树低用boo标记
memcpy(p->aa,a,sizeof(p->aa));//把a字符串存入树低
}
void search(char c[])
{
int len=strlen(c);
node *p=root;
for(int i=0;i<len;i++)//按树查找,如果到了树低boo值为1,就将字符aa输出
{
if(p->next[c[i]-'a']!=NULL)
p=p->next[c[i]-'a'];
else
{
printf("eh\n");
return ;
}
}
if(p->boo==1)
printf("%s\n",p->aa);
else
printf("eh\n");
}
int main()
{
char a[15],b[15],c[15];
trie();
while(scanf("%s",a)&&getchar()==' ')//这个格式真让人纠结
{
scanf("%s",b);
insert(a,b);
}
do
{
search(a);
}
while(scanf("%s",a)!=EOF);
return 0;
}
数组版
#include<stdio.h>
#include<string.h>
struct trie
{
int boo;
char node [15];
int son[27];
}tree[150010];
int num;
void insert(char a[],char b[])
{
int now=0;
for(int i=0;i<strlen(b);i++)
{
if(tree[now].son[b[i]-'a']==-1)
{
num++;
for(int t=0;t<26;t++)
tree[num].son[t]=-1;
tree[num].boo=0;
tree[now].son[b[i]-'a']=num;/*i wrote the son as 'A' at the first time*/
}
now=tree[now].son[b[i]-'a'];
}
memcpy(tree[now].node,a,sizeof(tree[now].node));
tree[now].boo=1;
}
int find(char temp[])
{
int now=0;
for(int i=0;i<strlen(temp);i++)
{
now=tree[now].son[temp[i]-'a'];
if(now==-1)
return 0;
}
if(tree[now].boo)
{
printf("%s\n",tree[now].node);
return 1;
}
return 0;
}
int main()
{
for(int i=0;i<26;i++)
tree[0].son[i]=-1;
char a[15],b[15];
while(scanf("%s",a)&&getchar()==' ')
{
scanf("%s",b);
insert(a,b);
}
do
{
if(find(a)==0)
printf("eh\n");
}
while(scanf("%s",a)!=EOF);
return 0;
}