【hihocoder】1014. Trie树

Trie树的建立,基本上就是按照深度优先搜索的顺序来进行插入结点。

同时,设定一个label,来记录当前经过该node时有多少结点,便于在

查询的时候,可以直接输出,而不需要再次dfs进行搜索。

/**
 *  @author         johnsondu
 *  @time           16:24 9th Sep 2015
 *  @type           trie tree
 *  @url            http://hihocoder.com/problemset/problem/1014
 */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <algorithm>
#include <map>
#include <vector>

using namespace std;

const int MAXN = 105;

struct Trie
{
    char ch;
    int cnt;
    Trie *next[26];
    Trie() {
        cnt = 0;
        for(int i = 0; i < 26; i ++)
            next[i] = NULL;
    }
};

Trie root;
int ans;

void insertWord(char* str)
{
    int len = strlen(str);
    Trie *head = &root;
    for(int i = 0; i < len; i ++) {
        int idx = str[i] - 'a';
        if(head->next[idx] == NULL) {
            Trie *node = new Trie;
            node->ch = str[i];
            head->next[idx] = node;
        }

        head = head->next[idx];
        head->cnt ++;
    }
}

void queryWord(char *str)
{
    Trie* head = &root;
    int len = strlen(str);
    ans = 0;
    for(int i = 0; i < len; i ++) {
        int idx = str[i] - 'a';
        if(head->next[idx] == NULL) return;
        else {
            head = head->next[idx];
        }
    }
    ans = head->cnt;

}

int main()
{
    char str[MAXN];
    int n, m;
    cin >> n;
    for(int i = 0; i < n; i ++)
    {
        cin >> str;
        insertWord(str);
    }

    cin >> m;
    for(int i = 0; i < m; i ++) {
        cin >> str;
        ans = 0;
        queryWord(str);
        cout << ans << endl;
    }


    return 0;
}
    原文作者:Trie树
    原文地址: https://blog.csdn.net/zone_programming/article/details/48734455
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞