歌词本 牛客小白月赛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\n",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.\n",s.c_str());
else {
mp[s]--;
printf("String \"%s\" has been deleted once.\n",s.c_str());
}
}
else if(a==3){
printf("----------\n");
printf("Miku's Lyrics Book:\n");
for(map<string,int>::iterator iter=mp.begin();iter!=mp.end();iter++){
for(int i=1;i<=iter->second;i++){
printf("%s\n",(iter->first).c_str());
}
}
printf("----------\n");
}
else if(a==4){
cin>>s;
if(mp[s]>=1){
printf("String \"%s\" is exsit, there is (are) %lld in the book.\n",s.c_str(),mp[s]);
}
else
printf("String \"%s\" doesn't exsit.\n",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,建议使用动态分配内存而不是静态开内存池以防止内存超限。
本题不卡算法的时间复杂度的常数(时间限制为标程运行时间的两倍以上)。