阿里巴巴的手机代理商正在研究 infra 输入法的新功能。他们需要分析单词频率以改进用户输入法的体验。于是需要你在系统内核里面写一个 API。 API 有如下功能:
添加操作
添加操作格式为
insert barty 8
,意思为插入barty
这个单词,这个单词词频为 88 次。注意如果再次添加insert barty 8
操作时,就会将词频增加为 1616 次。(不会出现词频 \le 0≤0 的情况)。删除操作
删除操作格式为
delete barty
,意思为删除所有barty
这个单词。如果当前没有删除的词汇,输出
Empty
。查询操作
查询操作格式为
query ty
,意思为查询当前版本以ty
结尾的单词词频总和。
输入格式
第一行读入一个整数 TT,代表数据组数。
每组数据的第一行读入一个整数 NN 代表操作数。
接下来 NN 行,每行形容一个操作。
保证数据满足 1 \le T \le 101≤T≤10,1 \le N \le 10001≤N≤1000,insert
操作的字符串总长度之和 \le 3000≤3000,所有字符串长度 \le 10000≤10000,输入只有小写字母。
输出格式
输出题目中要求的结果。
样例输入
1 6 insert barty 8 query ty insert party 9 query ty delete barty query ty
样例输出
8 17 9
#include <iostream> #include <map> #include <algorithm> #include <string> using namespace std; int main() { //freopen("1.txt", "r", stdin); int T; int N; cin >> T; map<string, int> a; map<string, int> b; while (T--) { cin >> N; a.clear(); b.clear(); for (int i = 0; i < N; i++) { string order; cin >> order; if (order == "insert") { string word; int num; cin >> word >> num; if (a.count(word) == 0) a.insert(pair<string, int>(word, num)); else a[word] += num; for (unsigned i = 0; i < word.length(); i++) { string sub = word.substr(i, word.length()); if (b.count(sub) == 0) b.insert(pair<string, int>(sub, num)); else b[sub] += num; } } else if (order == "delete") { string word; cin >> word; if (a.count(word) == 0) cout << "Empty" << endl; else { for (unsigned i = 0; i < word.length(); i++) { string sub = word.substr(i, word.length()); if (b.count(sub) == 1) { b[sub] -= a[word]; } } a.erase(word); } } else if (order == "query") { string tail; cin >> tail; if (b.count(tail) == 0) cout << 0 << endl; else cout << b[tail] << endl; } } } return 0; }