int son[N][26];//存储节点,的下一个节点的下标。 int idx; int cnt[N];//存储有几个以该节点为结尾的字符串。 voidinsert(string x) { int p = 0; for(int i=0;i<x.length();i++) { int u = x[i]-'0'; if(!son[p][u]) son[p][u] = ++idx;//如果节点为空,则新建节点。 p = son[p][u]; } cnt[p]++; } intquery(string x) { int p=0; for(int i=0;i<x.length();i++) { int u=x[i]-'0'; if(!son[p][u]) return0; p = son[p][u]; } return cnt[p];
voidinsert(int x) { int p =0; for(int i=30;i>=0;i--) { int &s = son[p][(x>>i)&1];//对每一位挨个存储。 if(!s) s = ++idx; p = s; } } intoption(int x) { int res= 0; int p =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];