ACM-ICPC中国区教练群内有各个高校的ACM教练和老师。某天上决╇ф装成教练混进了这个群。经过观察发现,群内经常发布一些比赛通知,且群内的各个高校的教练总是能收到比赛通知,并组织学生参加比赛。同时,每天也有些退役的教练退出该群,也有新的教练加入该群。每个教练的群名片总是为”[学校名]教练名”,如”[swust]w703710691d”。现在上决╇ф已经将该群的日志记录下来了,且日志记录前,没有教练在群中。他想知道,每次比赛发布的时候,有多少所不同的高校能收到比赛通知。
Input
第一行输入一个正整数n
(1≤n≤105),表示上决╇ф记录下的日志的条数。 接下来n行,每行一条日志。日志分别为以下三种类型: JOIN [school]name 一名名为name、来自于school高校的的教练加入了教练群。 LEAVE [school]name 一名名为name、来自于school高校的的教练离开了教练群。 HOLD 此时发布了比赛通知。 由于上决╇ф是使用钢笔和纸手动记录下了这有趣的一切,所以可能有错误的记录。包括:加入了一个已经在群内的教练,离开一个不在群中的教练。这些操作都是非法的,应该予以忽略。请注意,不同高校,可能存在相同的名字的教练。但是同一高校内,一定不会存在名字相同的教练。 保证学校名和教练名只包含大小写字母和下划线。且每个学校名和教练名的长度均不超过20
个字符
Output
对于每一次HOLD,输出有多少所不同的高校能收到比赛通知。
Sample Input
Raw
10
JOIN [swust]just_sort
JOIN [swust]Shunhua_Tan
JOIN [uestc]Zhu_He
JOIN [thu]Lijie_Chen
HOLD
LEAVE [swust]just_sort
HOLD
JOIN [swust]Shunhua_Tan
LEAVE [uestc]Zhu_He
HOLD
Sample Output
Raw
3
3
2
思路一开始没有做出来是因为,那个,一个学校的人,在还是没在,因该怎么搞,一点都不清楚,好像没有三维的,一开始有点想map + set了。但是感觉好傻逼。。。。。后来看看别人的。好吧,就是整个字符串一起放在。看是否出现过,因为,一个学校的人没有同名字的,所以。。。。诶。。。。
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
map<string , int> vis , use;
int main()
{
int n , cnt = 0;
scanf("%d",&n);
while(n--){
char a[20] , ss[50];
scanf("%s",a);
string str , s1 ;
if(a[0] == 'H') printf("%d\n",cnt);
else if(a[0] == 'J'){
scanf("%s",ss);
if(vis[ss]) continue;
else vis[ss] = 1;
int l = strlen(ss) , i;
for(i = 0 ; i < l ; i++){
str += ss[i];
}
for(i = 1 ; ss[i] != ']' ; i++){
s1 += ss[i];
}
if(use[s1] == 0) cnt++ ;
use[s1]++;
}
else if(a[0] == 'L'){
scanf("%s",ss);
if(vis[ss] == 0) continue;
else vis[ss] = 0;
int l = strlen(ss),i;
for(int i = 1 ; ss[i] != ']' ; i++){
s1 += ss[i];
}
use[s1]--;
if(use[s1] == 0) cnt--;
}
}
return 0;
}