版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sdz20172133/article/details/84202331
具体原理:刘汝佳《算法竞赛入门经典训练指南》P208
作用:字典树又叫单词查找树(Trie)或前缀树,是一个实现字符串。你可以在O(m)(m为所给单词的长度)时间内判断出该单词是否属于字典。
代码模板:
struct Trie
{
int ch[maxnode][sigma_size];//ch[i][j]==k表示第i个节点的第j个儿子是节点k
int val[maxnode];//val[i]==x表示第i个节点的权值为x
int sz;//字典树一共有sz个节点,从0到sz-1标号
//初始化
void clear()
{
sz=1;
memset(ch[0],0,sizeof(ch[0]));//ch值为0表示没有儿子
}
//在字典树中插入单词s,但是如果已经存在s单词会重复插入且覆盖权值
//所以insert前需要判断一下是否已经存在s单词了
void insert(string s)
{
int u=0,n=s.length();
for(int i=0;i<n;i++)///建立字典树
{
int id=s[i]-'a';
if(ch[u][id]==0)//无该儿子
{
ch[u][id]=sz;
memset(ch[sz],0,sizeof(ch[sz]));
val[sz++]=0;
}
u=ch[u][id];
}
val[u]=n;
}
//在字典树中查找单词s
bool find(string s)
{
int n=s.length(),u=0;
for(int i=0;i<n;i++)
{
int id=s[i]-'a';
if(ch[u][id]==0)
return false;
u=ch[u][id];
}
return val[u];
}
};
Trie trie;
经典例题:
HDU 1251 统计难题 字典树简单应用(找出所有以字符串s为前缀的单词个数)
Uva1401 Remember the Word 字典树简单应用(求一个字符串能有多少种方式通过字典中的单词构成)
HDU 1671 Phone List 字典树 (多种做法:问你字典中是否有一个字符串是其他字符串的前缀)
HDU 1247 Hat’s Words( 字典树Trie):单词匹配
异或(两题一样,推荐第二道)
CH 1602 The XOR Largest Pair 字典树+异或
NBUT-1597 Find MaxXorSum 经典字典树求异或最大值(数据量大)
扫描二维码关注公众号,回复:
4227158 查看本文章
POJ 3764 The xor-longest Path dfs+字典树求最大异或