Problem Description
遇到单词不认识怎么办? 查字典啊,已知字典中有n个单词,假设单词都是由小写字母组成。现有m个不认识的单词,询问这m个单词是否出现在字典中。
Input
含有多组测试用例。
第一行输入n,m (n>=0&&n<=100000&&m>=0&&m<=100000)分别是字典中存在的n个单词和要查询的m个单词.
紧跟着n行,代表字典中存在的单词。
然后m行,要查询的m个单词
n=0&&m=0 程序结束
数据保证所有的单词都是有小写字母组成,并且长度不超过10
Output
若存在则输出Yes,不存在输出No .
Sample Input
3 2 aab aa ad ac ad 0 0
Sample Output
No Yes
#include<bits/stdc++.h> using namespace std; struct node { int data; //记录出现了几次,这个字符串 struct node *next[26]; }; struct node a[1000000]; int top; struct node *creat() { int i; struct node *root = &a[top++]; root->data = 0; for(i = 0; i < 26; i++) root->next[i] = NULL; return root; }; struct node *Insert(struct node *root, char str[]) { struct node *p = root; int i, t; for(i = 0; str[i]; i++) //将字符串的字符一个一个放入字典树的结点中 { t = str[i] - 'a'; //下标,0到25分别对应这二十六个字母 if(!p->next[t]) p->next[t] = creat(); //如果对应下标的孩子结点是空,创造一个 p = p->next[t]; //否则就继续 } p->data++; //让字符串中最后一个字符,对应的结点的data值++,记录该字符出现了几次 return root; } int Search(struct node *root, char str[]) { struct node *p = root; int i, t; for(i = 0; str[i]; i++) { t = str[i] - 'a'; if(!p->next[t]) return 0; //如果是空,代表没有一样的字符串return 0,也就是没有找到 p = p->next[t]; } return p->data; //字符串循环成功走完,代表有它的母串,或者一样的,如果是母串就返回0,如果一样就返回出现了几次 } int main() { int n, m, i; char str[12]; while(scanf("%d %d", &n, &m) && n &&m) { top = 0; struct node *root = creat();//先建好字典树的根,空的字典树 for(i = 0; i < n; i++) { scanf("%s", str); root = Insert(root, str); //构建字典树 } while(m--) { scanf("%s", str); if(Search(root, str)) printf("Yes\n"); else printf("No\n"); } } }