阿里巴巴的手机代理商正在研究 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;
}