#include <iostream>
using namespace std;
const int N = 100010; // 定义常量 N 表示字典树节点的最大数量
int son[N][26], cnt[N], idx; // son数组存储字典树,cnt数组记录某个字符串结束时的节点个数,idx表示当前字典树的节点总数
char str[N]; // 存储输入的字符串
// 插入字符串到字典树
void insert(char str[])
{
int p = 0; // p 指向当前节点,初始化为根节点(下标0)
for (int i = 0; str[i]; i++) // 遍历字符串中的每个字符
{
int u = str[i] - 'a'; // 计算当前字符对应的字母索引值(0-25)
if (!son[p][u]) // 如果当前字符对应的子节点不存在
son[p][u] = ++idx; // 创建新的节点,并将当前节点的子节点指向新节点
p = son[p][u]; // 移动到子节点,继续处理下一个字符
}
cnt[p]++; // 当前字符串插入结束,将对应节点的计数加1
}
// 查询字符串在字典树中出现的次数
int query(char str[])
{
int p = 0; // p 指向当前节点,初始化为根节点(下标0)
for (int i = 0; str[i]; i++) // 遍历字符串中的每个字符
{
int u = str[i] - 'a'; // 计算当前字符对应的字母索引值(0-25)
if (!son[p][u]) // 如果当前字符对应的子节点不存在
return 0; // 说明该字符串不存在于字典树中,返回0
p = son[p][u]; // 移动到子节点,继续处理下一个字符
}
return cnt[p]; // 查询结束,返回字符串对应节点的计数,即字符串在字典树中出现的次数
}
int main()
{
int n;
cin >> n; // 输入操作的次数
while (n--)
{
char os; // 操作类型
cin >> os >> str; // 输入操作类型和字符串
if (os == 'I') // 如果操作类型是插入
insert(str); // 调用插入函数将字符串插入字典树
else // 如果操作类型是查询
cout << query(str) << endl; // 调用查询函数并输出字符串出现的次数
}
return 0;
}