笔记本

问题描述

为了复习考研英语,yhf开始背单词。
yhf有一个笔记本,一开始是空的。当yhf遇到一个不认识的单词时,他会先查找笔记本,如果笔记本上没有,他就会先在互联网上查找这个单词,然后记在笔记本上。当yhf认为他已经熟记一个单词时,他会将这个单词在笔记本上擦掉(如果笔记本上没有就不用擦了)。yhf有时也会关心他的笔记本上记了多少单词,他会将笔记本上的单词按照字典序升序读一遍。
这天,yhf发现他的笔记本已经记满了单词,他决定用程序来实现笔记本的功能。但考虑到编写程序消耗的时间可以多背几千个单词,他决定把这个任务交给你。

输入格式

输入第一行包含一个整数 mm,接下来有 mm 行,每一行有一个整数 opop,表示你的程序应执行哪种操作,具体如下

  • op=1op=1,后接一个单词,表示查找这个单词;如果笔记本中没有这个单词,则将单词写进笔记本
  • op=2op=2,后接一个单词,表示删除这个单词;如果笔记本中没有这个单词,则无需进行操作
  • op=3op=3,表示按字典序通读整个笔记本

输出格式

输出 mm 行,每一行表示输入的操作对应的输出,具体如下

  • op=1op=1,如果笔记本中有这个单词,输出found,否则输出write
  • op=2op=2,如果笔记本中有这个单词,输出erased,否则输出not found
  • op=3op=3,在一行内按字典序升序输出所有单词,中间用空格隔开

样例输入

8
1 problem
1 problem
2 problem
1 problem
2 acm
1 pro
1 acm
3

样例输出

write
found
erased
write
not found
write
write
acm pro problem

评测用例规模与约定

对于60%的数据,m100m\le 100
对于100%的数据,m105m\le 10^5,单词长度 s10|s|\le 10 且由小写字母构成。
保证操作3的次数不超过3次。

#include <bits/stdc++.h>
using namespace std;

set<string> s;

void op(const int& op, const string& w) {
    switch (op) {
        case 1:
            if (s.find(w) == s.end()) {
                printf("write\n");
                s.emplace(w);
            } else {
                printf("found\n");
            }
            break;
        case 2:
            if (s.find(w) == s.end()) {
                printf("not found\n");
            } else {
                printf("erased\n");
                s.erase(w);
            }
            break;
        case 3:
            for (const string& i : s) {
                cout << i << ' ';
            }
            printf("\n");
            break;

        default:
            break;
    }
}

int main() {
    int m,p;
    string w;
    cin >> m;
    for (int i = 0; i < m;++i){
        cin >> p;
        if(p!=3)
            cin >> w;
        op(p, w);
    }
    return 0;
}