这道题真的是用来练哈希表的无疑

但是这道题真的用哈希吗?


答案是:不用!


我们都学过STL没学过去看一下,stack,queue,seet,map,这道题的书名还小于200:

正是启用map的好时机!


map:一种STL容器

它的具体操作有

map的基本操作函数:

C++ maps是一种关联式容器,包含“关键字/值”对

begin()         返回指向map头部的迭代器

clear()        删除所有元素

count()         返回指定元素出现的次数, (帮助评论区理解: 因为key值不会重复,所以只能是1 or 0)

end()           返回指向map末尾的迭代器

equal_range()   返回特殊条目的迭代器对

erase()         删除一个元素

find()          查找一个元素

get_allocator() 返回map的配置器

insert()        插入元素

key_comp()      返回比较元素key的函数

lower_bound()   返回键值>=给定元素的第一个位置

max_size()      返回可以容纳的最大元素个数

rbegin()        返回一个指向map尾部的逆向迭代器

rend()          返回一个指向map头部的逆向迭代器

size()          返回map中元素的个数

swap()           交换两个map

upper_bound()    返回键值>给定元素的第一个位置

value_comp()     返回比较元素value的函数


那么这道题,

我们先定义一个map:

#include<map>
map<string,int>m;

我们只需要将每一本书都用map存一下:

m[书名]=1;

寻找的时候查找一下:

if(m.find(书名)!=m.end())cout<<"yes"<<endl;//如果没有这个元素就会返回这个map的最后一个元素的下一个地址

然后我们可爱的程序就成型啦!

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(){
	int n;
	char c[207];
	string d;
	cin>>n;
	map<string,int>m;
	while(cin>>d){
		if(d=="add"){
			gets(c);
			m[c]=1;
		}
		if(d=="find"){
			gets(c);
			if(m.find(c)!=m.end())cout<<"yes"<<endl;
			else cout<<"no"<<endl;
		}
	}
	return 0;
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

藜麦小笼包 3月前 回复TA
我和你的思路几乎一样,就一个超时,91分,不知为何QWQ
#include<bits/stdc++.h>
using namespace std;
int main()
{
    map<string,int>mp;
    int t;
    cin>>t;
    while(t--)
    {
        string s1,s2;
        cin>>s1;
        getline(cin,s2);
        if(s1=="add")
        {
            mp[s2]++;
        }
        else if(s1=="find")
        {
            if(mp.find(s2)==mp.end())
            cout<<"no"<<endl;
            else
            cout<<"yes"<<endl;
        }
    }
    return 0;
}
叶奇 2年前 回复TA
哇哇我写的真不错