#define N 100010 #define M 3000000 #define max(a, b) (((a) > (b)) ? (a) : (b))
//son存储字典树 idx为当前可用下标(每一层) int son[M][2],idx;
//插入字典树操作 voidinsert(int x){ int p=0; for(int i=30;~i;i--){ int bit = x>>i&1; if(!son[p][bit]) son[p][bit] = ++idx; p = son[p][bit]; } }
//寻找最大数 intsearch(int x){ int p=0,res=p; for(int i=30;~i;i--){ int bit = x>>i&1; if(son[p][!bit]){ res += 1<<i; p = son[p][!bit]; }else { p = son[p][bit]; } } return res; }
#include<iostream> usingnamespace std; //idx为当前可用的内存地址,cnt作为结尾标记 int son[N][N],idx,cnt[N]; //插入 voidinsert(char * str){ int p = 0; for(int i=0;str[i];i++){ int u = mapper//映射; if(!son[p][u]) son[p][u]=++idx; p = son[p][u] } cnt[p]++;//记录单词次数 }
//查找单词次数 intquery(char * word){ int p = 0; for(int i=0;word[i];i++){ int u = mapper; if(!son[p][u]) return0; p = son[p][u] } return cnt[p]; }