字典树
来源:互联网 发布:成都培训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;
}
#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
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树。。
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- hog特征原理详解及matlab代码学习笔记
- liblinphone注册状态的变化
- 解决Fiddler "creation of the root certificate was not successful”的问题
- ExtJs (3.2.0)文件目录介绍、文件删减、文件引用
- jeecg <t:formvalid>标签提交前验证 beforeSubmit
- 字典树
- awk内置函数
- mybatis解决字段名与实体类属性名不相同的冲突
- PPTP 相关命令
- Java成员变量的继承
- Sublime Text3 插件及快捷键
- 算法学习(十四)最大公约数问题
- C#委托中的协变与逆变
- iOS- 弹蒙层