洛谷p2580 点名,名对号map用法

文章介绍了如何使用C++中的map数据结构来解决一个化学竞赛教练点名的问题,教练可能因玩游戏而重复点名。文章详细讲解了map的定义、用法,包括插入、查找、删除元素以及排序等操作,并给出了具体的代码示例来解决点名错误检查的问题。
摘要由CSDN通过智能技术生成

1.题目:

题目背景

XS中学化学竞赛组教练是一个酷爱炉石的人。

他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛 CON900)。

题目描述

这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞赛学生的人数和名单,而你需要告诉校长他有没有点错名。(为什么不直接不让他玩炉石。)

输入格式

第一行一个整数 nn,表示班上人数。

接下来 nn 行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 5050)。

第 n+2n+2 行一个整数 mm,表示教练报的名字个数。

接下来 mm 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 5050)。

输出格式

对于每个教练报的名字,输出一行。

如果该名字正确且是第一次出现,输出 OK,如果该名字错误,输出 WRONG,如果该名字正确但不是第一次出现,输出 REPEAT

2.要用到的知识点:map

map简介
map是STL的一个关联容器,以键值对存储的数据,其类型可以自己定义,每个关键字在map中只能出现一次(可以多对1,不能1对多),关键字不能修改,值可以修改。map内部有序,按关键字排序(自动排序,单词时按照字母序排序。

map用法


1、头文件

#include<map>


2、定义

map<string,int> my_map;
也可以使用
typedef map<string,int> My_Map;
My_Map my_map;


3、基本方法

函数名                                                   功能
my_map.insert()或按照数组直接赋值    插入
my_map.find()                                       查找一个元素
my_map.clear()                                     清空
my_map.erase()                                    删除一个元素
my_map.size()                                      map的长度大小
my_map.begin()                                  返回指向map头部的迭代器
my_map.end()                                      返回指向map末尾的迭代器
my_map.rbegin()                                   返回一个指向map尾部的逆向迭代器
my_map.rend()                                  返回一个指向map头部的逆向迭代器
my_map.empty()                              map为空时返回true
swap()                                           交换两个map,两个map中所有元素都交换


4、map插入数据的几种方法

第一种:用insert函数插入pair数据:


map<int,string> my_map;
my_map.insert(pair<int,string>(1,"first"));
my_map.insert(pair<int,string>(2,"second"));


第二种:用insert函数插入value_type数据:


map<int,string> my_map;
my_map.insert(map<int,string>::value_type(1,"first"));
my_map.insert(map<int,string>::value_type(2,"second"));
 
map<int,string>::iterator it;           //迭代器遍历
for(it=my_map.begin();it!=my_map.end();it++)
    cout<<it->first<<it->second<<endl;


第三种:用数组的方式直接赋值:


map<int,string> my_map;
my_map[1]="first";
my_map[2]="second";
 
map<int,string>::iterator it;
for(it=my_map.begin();it!=my_map.end();it++)
    cout<<it->first<<it->second<<endl;


5、查找元素(判定这个关键字是否在map中出现)

第一种:用count函数来判断关键字是否出现,其缺点是无法定位元素出现的位置。由于map一对一的映射关系,count函数的返回值要么是0,要么是1。

map<string,int> my_map;
my_map["first"]=1;
cout<<my_map.count("first")<<endl;    //输出1;


第二种:用find函数来定位元素出现的位置,它返回一个迭代器,当数据出现时,返回的是数据所在位置的迭代器;若map中没有要查找的数据,返回的迭代器等于end函数返回的迭代器。

#include <map>  
#include <string>  
#include <iostream>  
 
using namespace std;  
  
int main()  
{  
    map<int, string> my_map;  
    my_map.insert(pair<int, string>(1, "student_one"));  
    my_map.insert(pair<int, string>(2, "student_two"));  
    my_map.insert(pair<int, string>(3, "student_three"));  
    map<int, string>::iterator it;  
    it = my_map.find(1);  
    if(it != my_map.end())  
       cout<<"Find, the value is "<<it->second<<endl;      
    else  
       cout<<"Do not Find"<<endl;  
    return 0;  
}

6、删除元素

#include <map>  
#include <string>  
#include <iostream>  
  
using namespace std;  
  
int main()  
{  
    map<int, string> my_map;  
    my_map.insert(pair<int, string>(1, "one"));  
    my_map.insert(pair<int, string>(2, "two"));  
    my_map.insert(pair<int, string>(3, "three"));  
   


    map<int, string>::iterator it;  
    it = my_map.find(1);  
    my_map.erase(it);                   
    int n = my_map.erase(1);          
    //用迭代器,成片的删除
    //把整个map清空
    my_map.erase( my_map.begin(), my_map.end() );  
    //成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合
   
    return 0;
}


7、排序

map中元素是自动按key升序排序(从小到大)的;按照value排序时,想直接使用sort函数是做不到的,sort函数只支持数组、vector、list、queue等的排序,无法对map排序,那么就需要把map放在vector中,再对vector进行排序。

#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
 
bool cmp(pair<string,int> a, pair<string,int> b) {
    return a.second < b.second;
}
 
int main()
{
    map<string, int> ma;
    ma["Alice"] = 86;
    ma["Bob"] = 78;
    ma["Zip"] = 92;
    ma["Stdevn"] = 88;
    vector< pair<string,int> > vec(ma.begin(),ma.end());
    //或者:
    //vector< pair<string,int> > vec;
    //for(map<string,int>::iterator it = ma.begin(); it != ma.end(); it++)
    //    vec.push_back( pair<string,int>(it->first,it->second) );
 
    sort(vec.begin(),vec.end(),cmp);
    for (vector< pair<string,int> >::iterator it = vec.begin(); it != vec.end(); ++it)
    {
        cout << it->first << " " << it->second << endl;
    }
    return 0;


3.本题代码

#include <bits/stdc++.h>
using namespace std;
map<string,int>a; 
int main()
{
	int n;
	cin>>n;
	
	string s;
	while(n--){
		cin>>s;
		a[s]=1;
	}
	int m;
	cin>>m;
	while(m--){
		cin>>s;
		if(a[s]==1){
			cout<<"OK"<<endl;
			a[s]=2;
		}else if(a[s]==2){
			cout<<"REPEAT"<<endl;
		}else{
			cout<<"WRONG"<<endl;
		}
	}
	
	
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值