字典树与01字典树
之前在做一道关于字符串匹配的题时,用到了[字典树](https://www.cnblogs.com/orangee/p/8912971.html),但那时是用指针实现的,这次又遇到需要使用字典树这一结构的题,向学姐要了她的板子,学习了用数组实现的方法,对于解题而言,更为简短快速。
因为题目要求最大异或和,因此用的是01字典树,在字典树的基础上稍作修改。
以下为字典树和01字典树的普遍实现:
字典树
```C++
#include
#include
using namespace std; 
struct Trie
{
    static const int N = 101010 , M = 26;
    int node[N][M],cnt[N],root,L; //cnt记录对应节点的字符串个数 
    void init()
	{
		fill_n(cnt,N,0);
		fill_n(node[N-1],M,0);
		L = 0;
		root = newnode();
	}
    int newnode()
	{ 
		fill_n(node[L],M,0); 
		return L++; 
	}
    void add(char *s)
	{
        int p = root;
        for(int i=0;s[i];++i)
		{
            int c = s[i] - 'a';
            if(!node[p][c]) 
				node[p][c] = newnode();
            p = node[p][c];
        }
        ++cnt[p];
    }
};
```
01字典树(可用于求异或和最大问题,long long型开64倍,int型开32倍)
```C++
#include
using namespace std;
struct Trie_01
{
    static const int maxn=1e5+10,N = 32*maxn,M = 2;
    int node[N][M],value[N],rt,L; //value记录对应节点的值,用于返回
    void init()
	{ 
		fill_n(node[N-1],M,0);
		fill_n(value,N,0);
		L = 0;
		rt = newnode();
	}
    int newnode()
	{
		fill_n(node[L],M,0);
	 	return L++; 
	}
    void add(int x)
	{
        int p = rt;
        for (int i=31;i>=0;--i)
        {
        	int idx = (x>>i)&1;
			if (!node[p][idx])
			{
				node[p][idx] = newnode();
			}
			p = node[p][idx];
			value[p]=min(value[p],x);
		}
    }
    int query(int x)
    {
    	int p = rt;
    	for (int i=31;i>=0;--i)
    	{
    		int idx = (x>>i)&1;
    		if (node[p][idx^1])
    			p = node[p][idx^1];
    		else
    			p = node[p][idx];
		}
		return value[p];
	}
};
```
   
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号