#include<iostream>usingnamespace std;constint N =100010;char str[N];int son[N][26], cnt[N], idx;/*
y总的Trie树用的是数组存,其核心在于idx,
我们可以看到idx是一直自增长的,
所以说,不同的字符占用的下标一定不一样,
这句话很重要,举个例子细细体会一下,假设’abcdg’和’abcef’,
’abc’是相同的,所以下标在son里都是一样的,但是’d’和’e’两个字符不相同,
必然导致idx会自增长,所以’d’和’e’在son[c]这26个下标处必然处于不同的位置,
这就实现了’c’同时指向’d’和’e’两个字母了。
*/voidinsert(char*str){int p =0;for(int i =0; str[i]; i ++){int u = str[i]-'a';if(!son[p][u]) son[p][u]=++ idx;
p = son[p][u];}
cnt[p]++;}intquery(char*str){int p =0;for(int i =0; str[i]; i ++){int u = str[i]-'a';if(!son[p][u])return0;
p = son[p][u];}return cnt[p];}intmain(){int n;
cin >> n;while(n --){
string s;
cin >> s >> str;if(s =="I")insert(str);elseprintf("%d\n",query(str));}return0;}
#include<iostream>usingnamespace std;constint N =100010, M =3100010;int n, mx, id;int num[N], son[M][2];voidinsert(int x){int p =0;for(int i =30; i >=0; i --){int&s = son[p][x >> i &1];if(!s) s =++ id;
p = s;}}intsearch(int x){int p =0, res =0;for(int i =30; i >=0; i --){int s = x >> i &1;if(son[p][!s]){
res +=1<< i;
p = son[p][!s];}else p = son[p][s];}return res;}intmain(){
cin >> n;for(int i =0; i < n; i ++){
cin >> num[i];insert(num[i]);}for(int i =0; i < n; i ++) mx =max(mx,search(num[i]));
cout << mx;return0;}