SDUT2828字典树

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");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/zhj9579/article/details/81667084