来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
又到饭点了,SK
同学靠着惯性走到了食堂,但长长的队伍顿时让他失去了食欲。突然,他注意到某个窗口前的队伍里明显存在插队的现象,于是他默默记录下了同学们进队和出队的变化。
对于进队,SK
同学只知道队伍里多了一个人,并不知道新来的人是老老实实站到了队尾还是插到了队伍里的某个位置;对于出队,SK
同学能确定是队伍里站在最前面的人出队了。
初始时队伍为空,给出n
条队伍进出的信息,保证已经出队的同学不会再入队,并且最终队伍也为空,现在SK
同学想知道有多少不插队的好同学。
输入描述:
第一行是一个正整数T(≤ 5)
,表示测试数据的组数, 对于每组测试数据, 第一行是一个整数n(1≤ n ≤ 100000)
,表示这个队伍进出的信息数, 接下来n行,每行是两个字符串Opt Name
,其中Opt
为"in
“代表进队,”out
"代表出队,Name
为进队或出队的人的名字, 所有信息按照时间顺序给出,名字由英文字母和阿拉伯数字组成,长度不超过10
,保证每个人的名字各不相同。
输出描述:
对于每组测试数据,输出一行,包含一个整数,表示不插队的人数。
- 示例1
- 输入
1
6
in quailty
in hwq1352249
out hwq1352249
in zhuaiballl
out quailty
out zhuaiballl
- 输出
2
AC:
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
map<string, int> mp;
string s[maxn];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T, n;
cin >> T;
while(T--)
{
string cur;
mp.clear();
queue<string> q;
while(!q.empty())
{
q.pop();
}
cin >> n;
int ans = 0;
for (int i = 1; i <= n;i++)
{
cin >> cur;
cin >> s[i];
if(cur == "in")
q.push(s[i]);
else
{
while(mp[q.front()] == 1)
{
q.pop();
}
if(s[i] == q.front())
ans++;
mp[s[i]] = 1;
}
}
cout << ans << endl;
}
return 0;
}
补充:
map 的基本操作函数:
C++ Maps 是一种关联式容器,包含“关键字/值”对
begin() 返回指向 map 头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果 map 为空则返回 true
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的函数
摘自:w3cschool