[Aizu] ITP2_8_A: Map: Search

Posted by-sknight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Aizu] ITP2_8_A: Map: Search相关的知识,希望对你有一定的参考价值。

题目

传送门: ITP2_8_A: Map: Search

描述

对于存储由一对字符串键和整数值形成的元素的字典M, 执行下面给出的操作, 请注意, M中的每一个键必须是唯一的

  • \\(insert(key, x)\\): 插入一个由键和值组成的元素到M中, 如果已经有元素包含了这个键, 替换那个元素的值为x
  • \\(get(key)\\): 输出一个指定的键对应的值

输入

输入以下列格式给出

\\(q\\)
\\(query_1\\)
\\(query_2\\)
\\(.\\)
\\(.\\)
\\(query_n\\)

每一个\\(query_i\\)都为:
\\(0\\) \\(key\\) \\(x\\)

\\(1\\) \\(key\\)
其中第一个数字0和1分别表示 insert 和 get 操作.

输出

对于每一个 get 操作, 在一行输出一个整数

限制条件

  • \\(1 \\leq q \\leq 200000\\)
  • \\(1 \\leq x \\leq 1000000000\\)
  • \\(1 \\leq\\) length of \\(key \\leq 20\\)
  • \\(key\\)全部由小写字母组成
  • 对于每一个 get 操作, 包含指定键值的元素一定存在于M中.

样例输入

7
0 blue 4
0 red 1
0 white 5
1 red
1 blue
0 black 8
1 black

样例输出

1
4
8

求解

自己实现

分析

关于哈希表的经典练习题, 不做多的说明

设计

由于请求的数量不超过200000, 为了使哈希表的效率更高, 空间分配为它的二倍左右
创建一个结构体 Ele 用于存储键值对构成的元素
设计一个hash函数, 计算出字符串对应的值
为了简单, 直接写了insert和get两个普通的函数, 直接操作全局变量的数组, 内部的移动也是随便给了数字, 担心所有的都聚在前面, 后面空出来, 万幸通过了

编码

#include <iostream>
#include <string>
using namespace std;
#define MAX_Q 400005

struct Ele 
    string key;
    int value;
    Ele() 
        key = "";
        value = 0;
    
    Ele(string str, int i) 
        key = str;
        value = i;
    
;

Ele space[MAX_Q];

long get_key(string str) 
    long total = 0;
    for (int i = 0; i < str.length(); i++) 
        total = (total * 4 + str[i] - 'a' + 1) % 1000000007;
    
    return total;


void insert(string key, int value) 
    int index = get_key(key) % MAX_Q;
    while (space[index].key != "" && space[index].key != key) 
        index = (index + 17541) % MAX_Q;
    
    Ele m(key, value);
    space[index] = m;


int search(string key) 
    int index = get_key(key) % MAX_Q;
    while (space[index].key != "" && space[index].key != key) 
        index = (index + 17541) % MAX_Q;
    
    if (space[index].key == key) 
        return space[index].value;
     else 
        return 0;
    
 

int main(void) 
    ios::sync_with_stdio(false);
    cin.tie(0);

    int q;
    cin >> q;
    int com, value;
    string key;
    while (q--) 
        cin >> com >> key;
        if (com == 0) 
            cin >> value;
            insert(key, value);
         else 
            cout << search(key) << endl;
        
    

结果

技术图片

总结

之前错了4次
第一次: 审题不清, 没有看清楚说键对应的值需要更新, 就直接往里扔, 导致get到了错误的元素
第二次: 指针只往后走, 忘了需要模数组大小, 然后出错
第三次: 对于一些长的字符串, 超出了计算出来的hash值超出了int的表示范围
第四次: 虽然修改了计算出的hash值, 使其输出为long, 但是里面的临时值却设置成了int, 导致临时值在还没来得及求模之前就已经溢出

STL

编码

#include <bits/stdc++.h>
using namespace std;

int main(void) 
    ios::sync_with_stdio(false);
    cin.tie(0);

    int q, com, x;
    string key;
    map<string, int> my_map;

    cin >> q;
    while (q--) 
        cin >> com >> key;
        if (com == 0) 
            cin >> x;
            my_map[key] = x;
         else 
            cout << my_map[key] << endl;
        
    

结果

技术图片

备注

哎, 我自己的居然时间和空间都能比模版好一丢丢, 莫名开心

以上是关于[Aizu] ITP2_8_A: Map: Search的主要内容,如果未能解决你的问题,请参考以下文章

Aizu ITP2_6_A(二分模板)

[Aizu] ITP2_11_A~D: 子集的枚举系列

[Aizu] ITP2_6_C: Lower Bound

[Aizu] ALDS1_13_A: 8 Queens Problem

Queue ,( Aizu - ALDS1_3_B )

Stack,( Aizu - ALDS1_3_A)