字典树

来源:互联网 发布:成都培训java多少人 编辑:程序博客网 时间:2024/06/07 12:26

字典树

Time Limit: 1000MS Memory limit: 65536K

题目描述

遇到单词不认识怎么办? 查字典啊,已知字典中有n个单词,假设单词都是由小写字母组成。现有m个不认识的单词,询问这m个单词是否出现在字典中。

输入

含有多组测试用例。
第一行输入n,m (n>=0&&n<=100000&&m>=0&&m<=100000)分别是字典中存在的n个单词和要查询的m个单词.
紧跟着n行,代表字典中存在的单词。
然后m行,要查询的m个单词
n=0&&m=0 程序结束
数据保证所有的单词都是有小写字母组成,并且长度不超过10

输出

若存在则输出Yes,不存在输出No .

示例输入

3 2aabaaadacad0 0

示例输出

NoYes

提示

 

来源

gyx

示例程序



字典树的模板可以当做哦!
#include <stdio.h>
#include <string.h>
struct node
{
    int next[26];
    bool flag;
}a[1000500];
int top;
int root;
char b[1000500],b1[1000500];
int creat()                                                        
{
    memset(a[top].next,-1,sizeof(a[top].next));
    a[top].flag = 0;
    return top++;
}
int xiabiao(char c)
{
    return c-'a';
}
void insert(int root,char *s)                 //创建
{
    int len,i;
    len = strlen(s);
    for(i=0;i<len;i++)
    {
        if(a[root].next[xiabiao(s[i])] == -1)
        {
            a[root].next[xiabiao(s[i])] = creat();
        }
        root = a[root].next[xiabiao(s[i])];
    }
    a[root].flag = 1;
}
int sreach(int root,char *s)              //查找
{
    int len,i;
    len = strlen(s);
    for(i=0;i<len;i++)
    {
        if(a[root].next[xiabiao(s[i])] == -1)
        {
            return 0;
        }
        root = a[root].next[xiabiao(s[i])];
    }
    return 1;
}
int main()
{
    int n,m,i,k;
    while(~scanf("%d %d",&n,&m)&&(n||m))
    {
        top = 0;
        root = creat();
        for(i=0;i<n;i++)
        {
            scanf("%s",b);
            insert(root,b);
        }
        for(i=0;i<m;i++)
        {
            scanf("%s",b1);
            k = sreach(root,b1);
            if(k)
                printf("Yes\n");
            else
                printf("No\n");
        }
    }
    return 0;
}
这里使用数组模拟的,,
代码菜鸟,如有错误,请多包涵!!
0 0