西南科大oj 2613

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值