歌词本 牛客小白月赛10

链接:https://ac.nowcoder.com/acm/contest/280/J
来源:牛客网
 

题解: 模拟 用到map容器,map 是一种有序无重复的关联容器,内部是红黑树。

需要注意的是,string类用printf输出的时候,格式是这样printf("%s",str.c_str());

printf("%s",str); 是错误的。

原因在于:printf("%s", str.c_str());
printf里面要求是char*类型,string和char*是不一样的。

这段代码加样例,简单解释上面所说

signed main(){
    cin>>s;
    printf("%s ",s);
    cout<<s<<endl;
}

 

代码: 

#include <iostream>
#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
#define int long long
/*map 是一种有序无重复的关联容器*/
signed main(){
    ios::sync_with_stdio(0);
    map<string,int>mp;
    int a;
    string s;
    while(cin>>a){
        if(a==1){
            cin>>s;/*String是C++的,只能用cin读入的*/
            mp[s]++;
        }
        else if(a==2){
            cin>>s;
            if(mp[s]==0)
                printf("Baka Miku, string "%s" doesn't exsit.
",s.c_str());
            else {
                mp[s]--;
                printf("String "%s" has been deleted once.
",s.c_str());
            }
        }
        else if(a==3){
            printf("----------
");
            printf("Miku's Lyrics Book:
");
            for(map<string,int>::iterator iter=mp.begin();iter!=mp.end();iter++){
                for(int i=1;i<=iter->second;i++){
                    printf("%s
",(iter->first).c_str());
                }
            }
            printf("----------
");
        }
        else if(a==4){
            cin>>s;
            if(mp[s]>=1){
                 printf("String "%s" is exsit, there is (are) %lld in the book.
",s.c_str(),mp[s]);
            }
            else
                printf("String "%s" doesn't exsit.
",s.c_str());
        }

    }
    return 0;
}

题目描述

众所周知,Miku家里有一本歌词本,今天她要从这本歌词本中选择几个单词构成一首新曲,然而这本歌词本又太厚了,她不想自己查找某个词是不是在歌词本里,并且她想找的歌词也不一定在歌词本里,这是她所不愿看到的,但是这又无法避免。
Miku一边阅读着歌词本,一边向你询问,问你她读过的歌词中有没有出现过她给出的单词,并且她还会随时选出一些不满意的歌词删掉。要注意同一个歌词可能会重复出现多次。
Miku还想随时查询这个歌词本里面有什么,以便印刷成词典。你的程序也要处理这种询问。

输入描述:

输入的每一行包含一个操作和至多一个字符串。
若操作为1,则表示Miku念出了一句歌词,你需要将这句歌词插入到歌词本里。
若操作为2,则表示Miku不满意这句歌词,要求你从歌词本里删除这句歌词。
若操作为3,则表示Miku想将歌词本按字典序输出,以便印刷成词典。
若操作为4,则表示Miku选出了一句歌词,询问你它是否在歌词本里出现过。
输入以EOF(文件结束符,即您需要读取到输入文件末尾)结束。操作1、2、4均包含一个参数,为一个字符串,表示操作所需的字符串。
请结合样例以便更好的理解题意。

输出描述:

输出的每一行表示操作的结果,我们规定:
1. 对于所有将歌词添加到歌词本中的操作,不需要输出任何内容;
2. 对于所有删除操作,若成功删除,则输出「String "%s" has been deleted once.」,若歌词不存在,则输出「Baka Miku, string "%s" doesn't exsit.」,输出中「%s」表示被删除的歌词;
3. 对于所有按字典序输出歌词本的操作,请参考样例格式进行输出;
4. 对于所有查询操作,若查询的歌词存在,则输出「String "%s" is exsit, there is (are) %d in the book.」,否则输出「String "%s" doesn't exsit.」,输出中「%s」表示给定的歌词,「%d」表示给定歌词的出现次数。

示例1

输入

复制

1 a
1 a
3
4 a
2 a
2 c
4 a
4 c

输出

复制

----------
Miku's Lyrics Book:
a
a
----------
String "a" is exsit, there is (are) 2 in the book.
String "a" has been deleted once.
Baka Miku, string "c" doesn't exsit.
String "a" is exsit, there is (are) 1 in the book.
String "c" doesn't exsit.

说明

一开始歌词本里没有任何歌词。首先插入了两个「a」;然后按照字典序输出歌词本,输出两个「a」;查询「a」,很明显在歌词本中有两个「a」;删除一个「a」;删除「c」,因为「c」没有出现过,所以删除失败;查找「a」,此时歌词本中仅剩下一个「a」;查询「c」,明显的,「c」不存在。

备注:


 

输出描述中的直角引号“「”和“」”不需要输出,而输出描述中的半角引号需要原样输出。建议参考样例理解输入输出格式。
数据保证总操作数量不超过 106,并且保证按字典序输出次数不超过 50,且保证标准程序输出的大小不超过 32 MiB。
保证数据中只含有英文小写字母。且每个字符串长度不超过 10。
请特别注意本题的 IO 量较大,请使用较为快速的 IO 方式。
请注意本题的内存限制为 256 MiB,建议使用动态分配内存而不是静态开内存池以防止内存超限。
本题不卡算法的时间复杂度的常数(时间限制为标程运行时间的两倍以上)。

原文地址:https://www.cnblogs.com/UUUUh/p/10284033.html