//map实现
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
int n;
cin>>n;
map<string ,int>mp;
while(n--)
{
char k;
string s;
cin>>k;
cin>>s;
if(k=='I')
mp[s]++;
else
cout<<mp[s]<<endl;
}
}
#include <iostream>
#include <string>
using namespace std;
const int N = 2e5+10;
int son[N][26],idx;
int cnt[N];
void insert(string s){
int next_pos = 0; //下一个要插入的层
for(int i = 0; i < s.size(); i ++)
{
int bias = s[i] - 'a'; //计算下标;
if(son[next_pos][bias] == 0) son[next_pos][bias] = ++idx;
next_pos = son[next_pos][bias];
}
cnt[next_pos] ++;
}
int query(string s){
int next_pos = 0;
for(int i = 0; i < s.size(); i ++)
{
int bias = s[i] - 'a';
if(son[next_pos][bias] == 0) return 0;
next_pos = son[next_pos][bias];
}
return cnt[next_pos];
}
int main(){
int num;
cin >> num;
while(num --){
string a,b;
cin >> a >> b;
if(a == "I") insert(b);
if(a == "Q") cout << query(b) << endl;
}
return 0;
}
eg
插入abcd bcd abd
插入abcd
1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
插入bcd
1 5 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
插入abd
1 5 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 3 8 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0