字典树

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. Python基础学习三 字典、元组

    一.元组 元组,提示别人,这个值是不能被改变的,元组的定义方式是用(),小括号: 元组只有两个方法,那就是count和index mysql1 = ('127.0.0.1',3306,'my','ro ...

  2. log4j配置文件的手动加载与配置初始化

    一. 本地项目: 初始化log4j的日志配置,指定到src目录下(建议用2)         //1. 本地项目-属性文件配置         PropertyConfigurator.configu ...

  3. Python学习笔记_Python向Excel写入数据

    实验环境 1.OS:Win 10 64位 2.Python 3.7 3.如果没有安装xlwt库,则安装:pip install xlwt 下面是从网上找到的一段代码,网上这段代码,看首行注释行,是在L ...

  4. 2、awk的输出

    1.常见的输出格式整理 awk '{print "this is " $1, $2, $1*$2, NR, NF, $NF}' file1   ###字符输出,字段输出,运算输出, ...

  5. 数据库连接池DBUtils

    安装 pip3 install DBUtils DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法, ...

  6. 原生ajax访问服务器所展现的现象

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>ajax ...

  7. - Unknown tag (c:set).

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  8. iOS play video

    iOS: How to use MPMoviePlayerController up vote6down votefavorite 3 I've created a blank project (iO ...

  9. Recurrent Neural Network(递归神经网络)

    递归神经网络(RNN),是两种人工神经网络的总称,一种是时间递归神经网络(recurrent neural network),另一种是结构递归神经网络(recursive neural network ...

  10. Densely Connected Convolutional Networks(緊密相連卷積網絡)

    - Dense blocks where each layer is connected to every other layer in feedforward fashion(緊密塊是指每一個層與每 ...