sdut 字典树
Posted kaito77
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sdut 字典树相关的知识,希望对你有一定的参考价值。
字典树
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 "); else printf("No "); } } 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
"); else printf("No
"); } } return 0;}
以上是关于sdut 字典树的主要内容,如果未能解决你的问题,请参考以下文章
SDUT OJ 2610 Boring Counting(主席树)