NC20943. 歌词本
描述
输入描述
输入的每一行包含一个操作和至多一个字符串。
若操作为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」不存在。C++14(g++5.4) 解法, 执行用时: 1462ms, 内存消耗: 50972K, 提交时间: 2018-12-22 22:28:27
#include <bits/stdc++.h> using namespace std; const int maxn = 55; char s[maxn]; map<string, int> vis; signed main() { // freopen("in", "r", stdin); ios::sync_with_stdio(false); int cmd; vis.clear(); while(cin>>cmd) { if(cmd == 1) { cin>>s; vis[s]++; } if(cmd == 2) { cin>>s; if(vis[s] == 0) { printf("Baka Miku, string \"%s\" doesn't exsit.\n", s); } else { vis[s]--; printf("String \"%s\" has been deleted once.\n", s); } } if(cmd == 3) { printf("----------\n"); printf("Miku's Lyrics Book:\n"); for(map<string, int>::iterator it=vis.begin();it!=vis.end();++it) { for(int i = 0; i < it->second; i++) { printf("%s\n", (it->first).c_str()); } } printf("----------\n"); } if(cmd == 4) { cin>>s; if(vis[s]>=1) { printf("String \"%s\" is exsit, there is (are) %d in the book.\n", s, vis[s]); } else printf("String \"%s\" doesn't exsit.\n", s); } } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 1506ms, 内存消耗: 51148K, 提交时间: 2019-11-21 23:30:44
#include<bits/stdc++.h> using namespace std; map<string,int>V; int main() { int f; char R[15]; while(~scanf("%d",&f)) { if(f==1)scanf("%s",R),V[R]++; if(f==2) { scanf("%s",R); if(!V[R])printf("Baka Miku, string \"%s\" doesn't exsit.\n",R); else V[R]--,printf("String \"%s\" has been deleted once.\n",R); } if(f==3) { printf("----------\n"); printf("Miku's Lyrics Book:\n"); for(map<string,int>:: iterator i=V.begin();i!=V.end();i++) for(int j=1;j<=i->second;j++)printf("%s\n",(i->first).c_str()); printf("----------\n"); } if(f==4) { scanf("%s",R); if(V[R])printf("String \"%s\" is exsit, there is (are) %d in the book.\n",R,V[R]); else printf("String \"%s\" doesn't exsit.\n",R); } } return 0; }