列表

详情


NC20943. 歌词本

描述

众所周知,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」不存在。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

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; 
}

上一题