Tire字典树

原理:将字符串以根节点出发延伸的树,查找速度块,占用空间大。

image

应用

  1. 查找字符串是否出现过
    比如查找字符串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];
}
  1. 查找某一字符串前缀出现次数
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;//返回答案
}
posted @ 2022-01-18 14:11  snaliuu  阅读(49)  评论(0)    收藏  举报