Tire字典树
原理:将字符串以根节点出发延伸的树,查找速度块,占用空间大。
应用
- 查找字符串是否出现过
比如查找字符串str,只需要遍历str每个字符在字典树是否出现过,若某一字符在树上无枝点即没出现过
int son[N][26],cnt[N],idx;
char str[N];
void insert(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]++;
}
int query(char *str)
{
int p=0;
for(int i=0;str[i];i++)
{
int u=str[i]-'a';
if(!son[p][u])return 0;//如果访问到一个节点是空的说明没有此字符串出现过
p=son[p][u];
}
return cnt[p];
}
- 查找某一字符串前缀出现次数
int son[N][26],cnt[N],idx;
char str[N];
void insert()
{
int p=0;
for(int i=0;str[i];i++)
{
int &s=son[p][str[i]-'a'];
if(!s)s=++idx;//创造新节点
p=s;
}
cnt[p]++;
}
int query()
{
int p=0,res=0;
for(int i=0;str[i];i++)
{
int &s=son[p][str[i]-'a'];
if(!s)break;//遇到空节点直接结束,后面没有答案了
p=s;
res+=cnt[p];//找到节点加上这个以这个节点为结束的数量
}
return res;//返回答案
}