hihocoder 1014(字典树)

1014 : Trie树

题意:

  给出n个字符串和m个询问,每个询问为一个字符串,问该字符串是给出的n个字符串中多少个字符串的前缀?

分析:

  字典树的入门题。

  学习资料:大佬博客

代码:

数组写法

#include <map>
#include <queue>
#include <math.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;
#define ll long long
#define ull unsigned long long
#define cls(x) memset(x,0,sizeof(x))
#define clslow(x) memset(x,-1,sizeof(x))

const int wordLen=10;
const int maxn=1e5+100;

int n,m,rt,tot;

int trie[maxn*wordLen][26],sum[maxn*wordLen];

void Insert(char* s,int rt)
{
    int len=strlen(s);
    for(int i=0;i<len;i++){
        int x=s[i]-'a';
        if(trie[rt][x]==0){
            trie[rt][x]=++tot;
            sum[tot]=0;
        }
        rt=trie[rt][x];
        sum[rt]++;
    }
}

int Find(char* s,int rt)
{
    int len=strlen(s);
    for(int i=0;i<len;i++){
        int x=s[i]-'a';
        if(trie[rt][x]==0){
            return 0;
        }
        rt=trie[rt][x];
    }
    return sum[rt];
}

int main()
{
//    freopen("in.txt","r",stdin);
    char s[26];
    while(scanf("%d",&n)!=EOF)
    {
        rt=tot=1;
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            Insert(s,rt);
        }
        scanf("%d",&m);
        for(int i=1;i<=m;i++){
            scanf("%s",s);
            printf("%d
",Find(s,rt));
        }
    }
    return 0;
}
View Code

指针写法

#include <map>
#include <queue>
#include <math.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;
#define ll long long
#define ull unsigned long long
#define cls(x) memset(x,0,sizeof(x))
#define clslow(x) memset(x,-1,sizeof(x))

const int maxn=1e5+100;

struct TrieNode {
    int cnt;
    TrieNode* nex[26];
};
TrieNode* root;

TrieNode* build()
{
    TrieNode* node=new TrieNode;
    node->cnt=0;
    cls(node->nex);
    return node;
}

void Insert(char* s)
{
    int len=strlen(s);
    TrieNode* node=root;
    for(int i=0;i<len;i++){
        int x=s[i]-'a';
        if(node->nex[x]==NULL){
            node->nex[x]=build();
        }
        node=node->nex[x];
        node->cnt++;
    }
}

int Find(char* s)
{
    int len=strlen(s);
    TrieNode* node=root;
    for(int i=0;i<len;i++){
        int x=s[i]-'a';
        if(node->nex[x]==NULL){
            return 0;
        }
        node=node->nex[x];
    }
    return node->cnt;
}

void del(TrieNode* node)
{
    for(int i=0;i<26;i++){
        if(node->nex[i]!=NULL){
            del(node->nex[i]);
        }
    }
    free(node);
}

int main()
{
//    freopen("in.txt","r",stdin);
    int n,m;
    char s[26];
    while(scanf("%d",&n)!=EOF)
    {
        root=build();
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            Insert(s);
        }
        scanf("%d",&m);
        for(int i=1;i<=m;i++){
            scanf("%s",s);
            printf("%d
",Find(s));
        }
        del(root);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/shutdown113/p/9394120.html