// tr[i][j]表示根结点是i,子结点为j + 'a'。如果tr[i][j] != 0,则说明当前有这个子结点,如果==0,则说明没有这个结点 int tr[N][26], idx; // idx为一个结点的全局唯一序号, int cnt[N];
voidadd(string & x){ int p = 0; // 从树结点出发 for (auto& i : x) { int u = i - 'a'; // 将ascii字母映射成0-26的数值 if (!tr[p][u]) tr[p][u] = ++ idx; // 如果当前结点没有叶子结点,则添加一个叶子结点 p = tr[p][u]; // 将当前结点的指针移动到叶子结点上 } cnt[p] ++; }
intquery(string & x){ int p = 0; for (auto& i : x) { int u = i - 'a'; if (!tr[p][u]) return0; // 如果tr[p][u] == 0,则说明当前没有 p = tr[p][u]; } return cnt[p]; }
intmain(){ int n; cin >> n; for (int i = 0; i < n; i ++) { char I; string x; cin >> I >> x; if (I == 'I') { add(x); } else { cout << query(x) << endl; } } return0; }