(模板)hdoj1251(字典树模板题)

Posted frankchen831x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(模板)hdoj1251(字典树模板题)相关的知识,希望对你有一定的参考价值。

题目链接:https://vjudge.net/problem/HDU-1251

题意:给定一系列字符串之后,再给定一系列前缀,对每个前缀查询以该字符串为前缀的字符串个数。

思路:

  今天开始学字典树,从入门题开始。用数组实现,count数组表示每个结点出现次数,trie[0]为根节点。插入和查询一个字符串的复杂度为O(len)。len为字符串的长度。

AC code:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

const int maxn=1e6+5;   //树的大小,尽量开大点
int trie[maxn][30],num[maxn],cnt;
char str[15];

void insert(char *s){
    int len=strlen(s);
    int u=0;
    for(int i=0;i<len;++i){
        int t=s[i]-a;
        if(!trie[u][t]){
            ++cnt;
            memset(trie[cnt],0,sizeof(trie[cnt]));
            trie[u][t]=cnt;
        }
        u=trie[u][t];
        ++num[u];
    }
}

int query(char *s){
    int len=strlen(s);
    int u=0;
    for(int i=0;i<len;++i){
        int t=s[i]-a;
        if(!trie[u][t]) return 0;
        u=trie[u][t];
    }
    return num[u];
}

int main(){
    cnt=0;
    memset(trie[0],0,sizeof(trie[0]));
    memset(num,0,sizeof(num));
    while(gets(str),str[0]!=)
        insert(str);
    while(~scanf("%s",str))
        printf("%d
",query(str));
    return 0;
}

 

以上是关于(模板)hdoj1251(字典树模板题)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1251 统计难题(字典树入门模板题 很重要)

统计难题HDU - 1251map打表或字典树字典树模板

hdu-1251(字典树)

hdoj1251 统计难题 数据结构-Trie树裸题

HDU 1251 Trie树模板题

HDOJ/HDU 1251 统计难题(字典树啥的~Map水过)