阿里巴巴的手机代理商正在研究 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
解题思路:直接就是map的应用,用map<string,int>来存储字符串s出现的次数。但是因为查询的时候是查询字符串的尾部,所以我们存储的时候都进行倒序存储,就是把字符串翻转一下。没有很大的难点。不信看代码!
AC代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
int T, N;
map<string, int>m;
map<string, int>m2;
int main()
{
cin >> T;
while (T--)
{
cin >> N;
for (int i = 0; i < N; i++)
{
string s;
cin >> s;
if (s=="insert")
{
string s2;
cin >> s2;
int x;
cin >> x;
reverse(s2.begin(), s2.end());
string temp = "";
m[s2] += x;
for (int i = 0; i < s2.size(); i++)
{
temp += s2[i];
m2[temp]+=x;
}
}
if (s=="query")
{
string s2;
cin >> s2;
reverse(s2.begin(), s2.end());
cout << m2[s2] << endl;
}
if (s=="delete")
{
string s2;
cin >> s2;
reverse(s2.begin(), s2.end());
if (m[s2] == 0) cout << "Empty" << endl;
else
{
int x = m[s2];
//cout << x << endl;
m[s2] = 0;
string temp = "";
for (int i = 0; i < s2.size(); i++)
{
temp += s2[i];
if (m2.count(temp) !=0)
{
//cout << x << endl;
m2[temp] -= x;
}
}
}
}
}
m.clear();
m2.clear();
}
return 0;
}