码迷,mamicode.com
首页 > 其他好文 > 详细

sdut 字典树

时间:2020-02-17 19:54:32      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:put   back   div   strlen   mes   chinese   style   ade   family   

字典树

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

 

 

 

 

 

 

Output

No

Yes

 

 

 

 

等有空再补充链表的做法

#include <bits/stdc++.h>

using namespace std;
char s[20];
int trie[500010][26];        //数组开的很玄学,大一点TLE小一点RTE
int cc[500010];        //用来证明单词存在
int f = 1;

void in_sert(){
    int k = strlen(s);
    int p = 0;
    for(int i = 0; i<k; i++){
        int c = s[i] - a;
        if(!trie[p][c]){
            memset(trie[f], 0, sizeof(trie[f]));        //能用到的时候再初始化,应该能省点时间?
            trie[p][c] = f;
            f++;
        }
        p = trie[p][c];    //p指向下一个字母的储存位置
    }
    cc[p] = 1;    //标记单词收尾处
}

bool se_arch(){
    int k = strlen(s);
    int p = 0;
    for(int i = 0; i<k; i++){
        int c = s[i] - a;
        if(trie[p][c] == 0) return 0//说明下一个字母不在树中,结束
        p = trie[p][c];
    }
    if(!cc[p]) return 0;        //在树中不是完整的单词,例如树中保存aaa,查询aa
    else return 1;
}

int main()
{
    int n, m;
    while(~scanf("%d%d", &n, &m)&&(n||m)){
        getchar();
        memset(trie[0], 0, sizeof(trie[0]));
        memset(cc, 0, sizeof(cc));
        f = 1;    //用来指示字母保存的位置
        while(n--){
            scanf("%s", s);
            in_sert();
        }
        while(m--){
            scanf("%s", s);
            int t = se_arch();
            if(t) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}

 

 

#include <bits/stdc++.h>
using namespace std;char s[20];int trie[500010][26];//数组开的很玄学,大一点TLE小一点RTEint cc[500010];//用来证明单词存在int f = 1;
void in_sert(){    int k = strlen(s);    int p = 0;    for(int i = 0; i<k; i++){        int c = s[i] - ‘a‘;        if(!trie[p][c]){            memset(trie[f], 0, sizeof(trie[f]));//能用到的时候再初始化,应该能省点时间?            trie[p][c] = f;            f++;        }        p = trie[p][c];//p指向下一个字母的储存位置    }    cc[p] = 1;//标记单词收尾处}
bool se_arch(){    int k = strlen(s);    int p = 0;    for(int i = 0; i<k; i++){        int c = s[i] - ‘a‘;        if(trie[p][c] == 0) return 0;//说明下一个字母不在树中,结束        p = trie[p][c];    }    if(!cc[p]) return 0;//在树中不是完整的单词,例如树中保存aaa,查询aa    else return 1;}
int main(){    int n, m;    while(~scanf("%d%d", &n, &m)&&(n||m)){        getchar();        memset(trie[0], 0, sizeof(trie[0]));        memset(cc, 0, sizeof(cc));        f = 1;//用来指示字母保存的位置        while(n--){            scanf("%s", s);            in_sert();        }        while(m--){            scanf("%s", s);            int t = se_arch();            if(t) printf("Yes\n");            else printf("No\n");        }    }    return 0;}

sdut 字典树

标签:put   back   div   strlen   mes   chinese   style   ade   family   

原文地址:https://www.cnblogs.com/kaito77/p/12323007.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!