SDUT OJ 字典树 AND 静态内存与动态内存
字典树
Time Limit: 1000 ms Memory Limit: 65536 KiB
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 静态内存与动态内存的更多相关文章
- C之静态内存和动态内存
静态内存: * 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 动态内存: * 程序员自己申请 * new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* ja ...
- C++函数中,两个自动释放内存的动态内存申请类
最近做一个事情,实现一个流程交互,其中主交互流程函数中,涉及较多的内存申请, 而健康的函数,都是在函数退出前将手动申请不再需要的内存释放掉, 使用很多方法,都避免不了较多的出错分支时,一堆的if fr ...
- 【STM32H7教程】第27章 STM32H7的TCM,SRAM等五块内存的动态内存分配实现
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第27章 STM32H7的TCM,SRAM等五块内 ...
- Java静态内存与动态内存分配的解析
1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用 ...
- 字符串输出输入函数,const修饰符,内存分区,动态内存管理,指针和函数,结构体
1.字符串输出输入函数 读入字符串的方法: 1) scanf 特点:不能接收空格 2) gets 特点:可以接受含有空格的字符串 ,不安全 3) fgets(); 特点:可以帮我们自动根据数组的长度截 ...
- C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)
C++语言定义了两个运算符来分配和释放动态内存:运算符new分配内存,运算符delete释放new分配的内存. 运算符new和delete 使用new动态分配和初始化对象 在自由空间分配的内存是无名的 ...
- HDU1247(经典字典树)
Hat’s Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)
Description We all use cell phone today. And we must be familiar with the intelligent English input ...
- Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...
随机推荐
- spring mvc default-servlet mvc:resources mvc:default-servlet-handler区别
mvc:default-servlet-handler其实就是default-servlet 交由web容器自己处理 mvc:resources spring来处理 没有被映射的url web容器来处 ...
- ubuntu安装vsftpd
使用以下命令安装vsftpd: apt-get install vsftpd 安装完成后,文件服务器已经开启了. 然后就可以连接,可以使用xftp等工具,在上传和下载的时候要注意权限,不然会失败.
- LCD 调试总结
转自:http://blog.csdn.net/qikaibinglan/article/details/5630246 (1) 液晶显示模式 并行:MCU接口.RGB接口.Vysnc接口 串行:SP ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 2_Linear regression with one variable 单变量线性回归
Lecture2 Linear regression with one variable 单变量线性回归 2.1 模型表示 Model Representation 2.1.1 线性回归 Li ...
- 通过helloworld来认识下backbone
Backbone主要涉及3部分:model,collection和view.而这个框架的优势在于:数据与视图分离,通过操作model来自动更新view. 根据我的个人经验,直接写个简单的例子是最最直观 ...
- Python将两个数组合并成一个数组,多维数组变成一维数组
1.extend方法 c1 = ["Red","Green","Blue"] c2 = ["Orange"," ...
- 【原创】1. MYSQL++简介
MYSQL++是对于MYSQL C API的C++完全包装. MYSQL++能够至少做如下几件事情 1. 连接数据库 通过TCP连接数据库 通过WINDOWS命名管道连接数据库 UNIX域SOCKET ...
- 【bzoj1614】[Usaco2007 Jan]Telephone Lines架设电话线
题目描述 Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N < ...
- laravel中的文件上传到本地+七牛云上传
首先在filesystems.php 配置好上传的文件的目录起名为upload 在Storage/目录下面 目录下面的app/upload 如果没有这个文件会自动创建 这里的名字upload名字是跟控 ...
- SpringBoot13 利用mybatis-plus自动生成entity、dao、service、controller
1 环境配置 = 2 新建一个新的springboot项目 2.1 选择一些必要的依赖 web jpa mysql <?xml version="1.0" encoding= ...