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/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...
随机推荐
- 【原】Coursera—Andrew Ng斯坦福机器学习(0)——课程地址和软件下载
斯坦福大学机器学习 课程信息 机器学习是一门研究在非特定编程条件下让计算机采取行动的学科.最近二十年,机器学习为我们带来了自动驾驶汽车.实用的语音识别.高效的网络搜索,让我们对人类基因的解读能力大大提 ...
- 使用GDB调试PHP代码,解决PHP代码死循环
最近在帮同事解决Swoole Server问题时,发现有1个worker进程一直处于R的状态,而且CPU耗时非常高.初步断定是PHP代码中发生死循环. 下面通过一段代码展示如何解决PHP死循环问题. ...
- ArcEngine开发遇到的问题(转)
ArcEngine开发遇到的问题 https://blog.csdn.net/u013751758/article/category/6971559 转载 2018年02月11日 17:28:11 1 ...
- selenium2 用testNG对百度首页输入框进行测试 (三)
如果还没有安装testNG的亲,可以点击http://www.cnblogs.com/milanmi/p/4346580.html查看安装过程. 这节主要是对百度首页的输入框进行输入测试. packa ...
- php const static define 基本用法和区别
const 定义一些在运行时不能被改变的数值.一旦值被改变,则会发生错误. 特性 只能用类名访问.不需要用 $ 符号 <?php class test{ const pi=123.12321 ...
- SQL SERVER FOR XML PATH合并字符串
两种方式,效率立竿见影 ------------------------------------------------ SET STATISTICS TIME ON DECLARE @OrderSt ...
- 【Leetcode009】Palindrome Number
问题链接:https://leetcode.com/problems/palindrome-number/#/description Question:Determine whether an int ...
- C#冒泡排序和直接插入排序
/// <summary> /// 冒泡排序 /// </summary> public static void Mainsdfdrt ...
- SpringMVC——<mvc:annotation-driven/>
会自动注 册RequestMappingHandlerMapping .RequestMappingHandlerAdapter 与 ExceptionHandlerExceptionResolver ...
- 编写高质量代码改善C#程序的157个建议——建议14: 正确实现浅拷贝和深拷贝
建议14: 正确实现浅拷贝和深拷贝 为对象创建副本的技术称为拷贝(也叫克隆).我们将拷贝分为浅拷贝和深拷贝. 浅拷贝 将对象中的所有字段复制到新的对象(副本)中.其中,值类型字段的值被复制到副本中后, ...