字典树

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

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

内存限制,需要申请静态内存,用malloc, new 等申请动态内存是不行的

动态内存与静态内存的区别
1. 静态内存

静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。

程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会

自动释放所占用的内存空间。

变量的分配与释放,都无须程序员自行考虑。

eg:

基本类型,数组

2. 动态内存

用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配。

3. 区别

a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用CPU资源。

b) 静态内存在栈(stack)上分配; 动态内存在堆(heap)上分配。

c) 动态内存分配需要指针和引用类型支持,静态不需要。

d) 静态内存分配是按计划分配,由编译器负责; 动态内存分配是按需分配,由程序员负责。

Memory Limit Exceeded代码:

#include <bits/stdc++.h>

using namespace std;

struct node
{
int data;
node *next[26];
}; struct node *create_empty( )
{
int i;
struct node *root = new node;
root->data = 0;
for(i=0; i<26; i++)
root->next[i] = NULL;
return root;
} struct node *Insert ( struct node *root, char *s )
{
struct node *p = root;
int i, t;
for( i=0; s[i]; i++ )
{
t = s[i] - 'a';
if( !p->next[t] )
p->next[t] = create_empty();
p = p->next[t];
}
p->data++;
return root;
} int Find( struct node *root, char *s)
{
struct node *p = root;
int i, t;
for( i=0; s[i]; i++ )
{
t = s[i] - 'a';
if( !p->next[t] )
return 0;
p = p->next[t];
}
return p->data;
} int main()
{
int n, m;
char word[11];
while( cin >> n >> m )
{
if( n==0 && m == 0 ) break;
struct node *root = create_empty(); while( n-- )
{
cin >> word;
root = Insert( root, word );
} while( m-- )
{
cin >> word;
if( Find( root, word ))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}

Accepted代码:

#include <bits/stdc++.h>

using namespace std;

struct node
{
int data;
node *next[26];
}; struct node a[1000000]; //申请静态内存;
int top; struct node *create_empty( )
{
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 *s )
{
struct node *p = root;
int i, t;
for( i=0; s[i]; i++ )
{
t = s[i] - 'a';
if( !p->next[t] )
p->next[t] = create_empty(); //该字母未存过,申请空间
p = p->next[t]; //向后走
}
p->data++; //单词结束
return root;
} int Find( struct node *root, char *s)
{
struct node *p = root;
int i, t;
for( i=0; s[i]; i++ )
{
t = s[i] - 'a';
if( !p->next[t] ) //单词中该字母未出现
return 0;
p = p->next[t];
}
return p->data;
} int main()
{
int n, m;
char word[11];
while( cin >> n >> m )
{
if( n == 0 && m == 0 ) break;
top = 0;
struct node *root = create_empty();
//建立空树 while( n-- )
{
cin >> word;
root = Insert( root, word ); //将单词插入树中
} while( m-- )
{
cin >> word;
if( Find( root, word ))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}

原代码MLE了,估计评测姬又出了问题,贴一发MeiK关于评测姬的内存测量问题

二次AC代码:把所有的链式操作全换成数组

#include <iostream>
#include <cstdio> using namespace std; const int N = 500005; struct node
{
int data;
int next[26];
}; node tree[N];
int top; int create_empty( )
{
fill( tree[top].next, tree[top].next+26, 0 );
tree[top].data = 0;
return top++;
} void Insert ( int root, char *s )
{
int i, t;
for( i=0; s[i]; i++ )
{
t = s[i] - 'a';
if( !tree[root].next[t] )
tree[root].next[t] = create_empty(); //该字母未存过,申请空间
root = tree[root].next[t]; //向后走
}
tree[root].data++; //单词结束
//return root;
} int Find( int root, char *s )
{
int i, t;
for( i=0; s[i]; i++ )
{
t = s[i] - 'a';
if( !tree[root].next[t] ) //单词中该字母未出现
return 0;
root = tree[root].next[t];
}
return tree[root].data;
} int main()
{
int n, m;
char word[11];
while( cin >> n >> m )
{
if( n == 0 && m == 0 ) break;
top = 0;
int root = create_empty();
//建立空树 while( n-- )
{
cin >> word;
Insert( root, word ); //将单词插入树中
} while( m-- )
{
cin >> word;
if( Find( root, word ))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}

SDUT OJ 字典树 AND 静态内存与动态内存的更多相关文章

  1. C之静态内存和动态内存

    静态内存: * 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 动态内存: * 程序员自己申请 * new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* ja ...

  2. C++函数中,两个自动释放内存的动态内存申请类

    最近做一个事情,实现一个流程交互,其中主交互流程函数中,涉及较多的内存申请, 而健康的函数,都是在函数退出前将手动申请不再需要的内存释放掉, 使用很多方法,都避免不了较多的出错分支时,一堆的if fr ...

  3. 【STM32H7教程】第27章 STM32H7的TCM,SRAM等五块内存的动态内存分配实现

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第27章       STM32H7的TCM,SRAM等五块内 ...

  4. Java静态内存与动态内存分配的解析

    1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用 ...

  5. 字符串输出输入函数,const修饰符,内存分区,动态内存管理,指针和函数,结构体

    1.字符串输出输入函数 读入字符串的方法: 1) scanf 特点:不能接收空格 2) gets 特点:可以接受含有空格的字符串 ,不安全 3) fgets(); 特点:可以帮我们自动根据数组的长度截 ...

  6. C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)

    C++语言定义了两个运算符来分配和释放动态内存:运算符new分配内存,运算符delete释放new分配的内存. 运算符new和delete 使用new动态分配和初始化对象 在自由空间分配的内存是无名的 ...

  7. HDU1247(经典字典树)

    Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  8. ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)

    Description We all use cell phone today. And we must be familiar with the intelligent English input ...

  9. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

随机推荐

  1. C# XML 文件中的空格值问题

    C# XML 文件中的空格值问题 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-15 近期正在写我的简易标记文件格式的程序, ...

  2. Python基础学习七 Excel操作

    python操作excel,python操作excel使用xlrd.xlwt和xlutils模块, xlrd模块是读取excel的,xlwt模块是写excel的,xlutils是用来修改excel的. ...

  3. C#中查询字符串中是否包含指定字符/串,使用IndexOf还是Contains?

    C#中查询字符串中是否包含指定字符/串,使用IndexOf还是Contains?这是一个很常见的命题,以前也没有注意,今天QQ群里有人提起,于是就做了下试验,代码如下: using System; u ...

  4. 常用的正则规则,直接copy就OK了

    import  re #用户名验证:(数字字母或下划线6到20位)re.match("/^\w{6,20}$/",匹配对象) #邮箱验证: re.match(" /^[a ...

  5. java基础之JDBC三:简单工具类的提取及应用

    简单工具类: public class JDBCSimpleUtils { /** * 私有构造方法 */ private JDBCSimpleUtils() { } /** * 驱动 */ publ ...

  6. 661. Image Smoother色阶中和器

    [抄题]: Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoo ...

  7. sed 之 & 符号

    sed 之 & 符号 摘自:https://blog.csdn.net/jasonliujintao/article/details/53509620 & 这个符号,其实很有用,在对相 ...

  8. IntelliJ IDEA——利用maven插件构建web工程

  9. WinAPI多线程

    WIN32线程控制主要实现线程的创建.终止.挂起和恢复等操作,这些操作都依赖于WIN32提供的一组API和具体编译器的C运行时库函数.在启动一个线程之前,必须为线程编写一个全局的线程函数,一般来说,C ...

  10. Visual Studio OpenCV 开发环境配置

    因为VS配置OpenCV好多新手都很难一次配置成功,而且OpenCV库每新建一个项目都要配置很是麻烦,所以今天就给大家介绍一个“一劳永逸”的方法. 注:理论上只要VS和OpenCV是版本兼容的,该方法 ...