码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-11-10 13:43:36      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:复杂度   set   trie   bsp   数组   复杂   数组实现   hdu   color   

题目链接: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]!=\0)
        insert(str);
    while(~scanf("%s",str))
        printf("%d\n",query(str));
    return 0;
}

 

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

标签:复杂度   set   trie   bsp   数组   复杂   数组实现   hdu   color   

原文地址:https://www.cnblogs.com/FrankChen831X/p/11829364.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!