数字盒子发表时间:2022-10-27 20:15 数字盒子 问题描述 你有一个盒子,你可以往里面放数,也可以从里面取出数。 初始时,盒子是空的,你会依次做 Q 个操作,操作分为两类: 1.插入操作:询问盒子中是否存在数 x,如果不存在则把数 x 丢到盒子里。 2.删除操作:询问盒子中是否存在数 x,如果存在则取 x。 对于每个操作,你需要输出是否成功插入或删除。 输入 第一行一个正整数 Q,表示操作个数。 接下来 Q 行依次描述每个操作。每行 2 个用空格隔开的非负整数 op,x 描述一个操作: op 表示操作类型,op=1 则表示这是一个插入操作,op=2 则表示这是一个删除操作;x 的意义与操作类型有关,具体见题目描述。 输 按顺序对所有操作输出,对于每个操作输出一行,如果成功则输出“Succeeded”(不含引号),如果失败则输出“Failed”(不含引号)。 样例输入 6 1100 1100 2100 1200 2100 2200 样例输 数据范围 对于 60% 的数据,保证 x<10^5。 对于 100% 的数据,保证 x<10^18,Q≤5*10^5。 对于所有数据,保证 op∈{1,2}。时间限制:10 sec 空间限制:256 MB 提示 [对于 x 较小的情况,我们只需要用数组记录每个数是否在盒子里即可。] [对于 x 较大的情况,我们可不可以用什么方法把它们“变小”呢?可以想想哈希表哦!] 代码 #include<iostream> #include<unordered_map> #include<string> #include<string.h> using namespace std;
int main() { unordered_map<string,int> HashMap_0; unordered_map<string, int> ::iterator iter; int n; cin >> n; string* str=new string[n];//用于存储输出的Succeeded或Failed int choic;//用于选择功能 string key; for (int i = 0; i < n; i++) { cin >> choic; if (choic == 1)//向map中插入key { getline(cin, key);//获取输入的字符串 iter = HashMap_0.find(key);//查找map中是否存在相同的key if (iter != HashMap_0.end())//若存在相同的key则不进行操作并返回Failed { str[i] = "Failed"; } else//若不存在相同的key则放入并提示Succeeded { HashMap_0.emplace(key, 1); str[i] = "Succeeded"; } } else if(choic == 2)//从map中删除key { getline(cin, key);//获取输入的字符串 iter = HashMap_0.find(key);//查找map中是否存在相同的key if (iter != HashMap_0.end())//若存在相同的key则进行删除并返回Succeeded { HashMap_0.erase(iter); str[i] = "Succeeded"; } else//若不存在相同的key则返回Failed { str[i] = "Failed"; } } }
for (int i = 0; i < n; i++) { cout << str[i] << endl; } return 0; } |