#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树的基础
最新推荐文章于 2021-09-02 13:02:31 发布