您的位置:首页 > 其它

Keep In Line(BNUOJ 队列 string,map应用)

2017-04-22 22:34 417 查看


K. Keep In Line

Time Limit: 2000ms

Memory Limit: 262144KB
64-bit integer IO format: %lld     
Java class name: Main

Submit Status

又到饭点了,SK同学靠着惯性走到了食堂,但长长的队伍顿时让他失去了食欲。突然,他注意到某个窗口前的队伍里明显存在插队的现象,于是他默默记录下了同学们进队和出队的变化。
对于进队,SK同学只知道队伍里多了一个人,并不知道新来的人是老老实实站到了队尾还是插到了队伍里的某个位置;对于出队,SK同学能确定是队伍里站在最前面的人出队了。
初始时队伍为空,给出

条队伍进出的信息,保证已经出队的同学不会再入队,并且最终队伍也为空,现在SK同学想知道有多少不插队的好同学。


Input

第一行是一个正整数

,表示测试数据的组数,
对于每组测试数据,
第一行是一个整数

,表示这个队伍进出的信息数,
接下来

行,每行是两个字符串Opt
Name,其中Opt为"in"代表进队,"out"代表出队,Name为进队或出队的人的名字,
所有信息按照时间顺序给出,名字由英文字母和阿拉伯数字组成,长度不超过

,保证每个人的名字各不相同。


Output

对于每组测试数据,输出一行,包含一个整数,表示不插队的人数。


Sample Input

1
6
in quailty
in hwq1352249
out hwq1352249
in zhuaiballl
out quailty
out zhuaiballl


Sample Output

2

题目分析:

题目很好理解。就是创建一个队列,然后入队出队,判断出队的是否是按照入队顺序,如果不是按照入队顺序即是插队。统计最后有多少个是不插队的人。

首先建一个队列,里面按照入队顺序存放字符串。然后等读入出队信息的时候,如果出队是正常出队,ans++,就直接删除队首元素,如果不是正常出队,并利用map标记此字符串为1,遇到队首元素标记为1的直接出队。最后输出ans。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
map<string,int>mp;
string s[100007];
int main(){
int t;
cin>>t;
while(t--){
int n;
string cur;
mp.clear();
queue <string> q;
while(!q.empty()){
q.pop() ;
}
cin>>n;
int ans=0;
for(int i=1;i&
4000
lt;=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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: