【Trie】Trie字典树模板 静态指针池、数组写法

下面是数组写法:

#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define idx(x) x - 'a';
const int MAXN = 1e6;
struct Trie {
    int next[26];
    int val;
}tree[MAXN];
int nxt, T;
char str[MAXN];

int add()
{
    memset(&tree[nxt], 0, sizeof(Trie));
    return nxt++;
}

void Insert(char *s)
{
    int rt = 0, len = strlen(s);
    for(int i = 0; i < len; i++) {
        int c = idx(s[i]);
        if(!tree[rt].next[c]) {
            tree[rt].next[c] = add();
        }
        rt = tree[rt].next[c];
    }
    tree[rt].val++;
}

bool Find(char *s)
{
    int rt = 0, len = strlen(s);
    for(int i = 0; i < len; i++) {
        int c = idx(s[i]);
        if(!tree[rt].next[c])
            return false;
        rt = tree[rt].next[c];
    }
    if(tree[rt].val) return true;
    return false;
}

int main()
{
    memset(&tree[0], 0, sizeof(Trie));
    nxt = 1;
    scanf("%d", &T);
    while(T--) {
        scanf("%s", str);
        Insert(str);
    }
    while(~scanf("%s", str)) {
        if(Find(str)) puts("exist");
        else puts("none");
    }
    return 0;
}

下面是静态指针池写法:

#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define idx(x) x - 'a';
const int MAXN = 1e6;
struct Trie {
	Trie *next[26];
	int val;
}tree[MAXN];
int nxt, T;
char str[MAXN];

Trie *add()
{
    memset(&tree[nxt], 0, sizeof(Trie));
    return &tree[nxt++];
}

void Insert(Trie *rt, char *s)
{
    int len = strlen(s);
    for(int i = 0; i < len; i++) {
        int c = idx(s[i]);
        if(!rt->next[c])
            rt->next[c] = add();
        rt = rt->next[c];
    }
    rt->val++;
}

bool Find(Trie *rt, char *s)
{
    int len = strlen(s);
    for(int i = 0; i < len; i++) {
        int c = idx(s[i]);
        if(!rt->next[c])
            return false;
        rt = rt->next[c];
    }
    if(rt->val)	return true;
    return false;
}

int main()
{
    nxt = 0;
    Trie *root = add();
    scanf("%d", &T);
    while(T--) {
        scanf("%s", str);
        Insert(root, str);
    }
    while(~scanf("%s", str)) {
        if(Find(root, str)) puts("exist");
        else puts("none");
    }
    return 0;
}
时间: 2024-10-09 04:38:31

【Trie】Trie字典树模板 静态指针池、数组写法的相关文章

字典树模板 [HDU 1251] 统计难题

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 19054    Accepted Submission(s): 8418 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前

Vasiliy&#39;s Multiset CodeForces -706D || 01字典树模板

就是一个模板 注意这题有一个要求:有一个额外的0一直保持在集合中 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int _LEN=30; 5 //上限为2^30-1,即二进制最多30位 6 int lft[40]; 7 namespace Trie 8 { 9 int ch[7001000][2],sz[7001000]; 10 int mem; 11 void insert(int

字典树模板(java)

class Trie{ private int SIZE=26; private TrieNode root;//字典树的根 Trie(){//初始化字典树 root=new TrieNode(); } private class TrieNode{//字典树节点 private int num;//有多少单词通过这个节点,即节点字符出现的次数 private TrieNode[] son;//所有的儿子节点 private boolean isEnd;//是不是最后一个节点 private c

字典树模板题 POJ 2503

1 #include <cstdio> 2 #include <cstring> 3 4 char en[11],fr[11]; 5 int st; 6 struct Tire{ 7 int next[26]; 8 char eng[11]; 9 }node[200005]; 10 void insert(char *s,int cur) 11 { 12 if(*s){ 13 if(!node[cur].next[*s-'a']) 14 node[cur].next[*s-'a']

Trie树(字典树)模板

1 // 2 // trie树模板.cpp 3 // 7.24集训 4 // 5 // Created by skygao on 2019/7/24. 6 // Copyright © 2019 skygao. All rights reserved. 7 // 8 9 #include <stdio.h> 10 #include <cstdlib> 11 #include <string> 12 #include <cstring> 13 #include

字典树模板( 指针版 &amp;&amp; 数组版 )

模板 : #include<string.h> #include<stdio.h> #include<malloc.h> #include<iostream> #include<algorithm> using namespace std; const int maxn = 26; struct Trie { Trie *Next[maxn]; int v; inline void init(){ this->v = 1; for(int

trie(字典树)原理及C++代码实现

字典树,又称前缀树,是用于存储大量字符串或类似数据的数据结构. 它的原理是利用相同前缀来减少查询字符串的时间. 不同于BST把关键字保存在本结点中,TRIE可以想象成把关键字和下一个结点的指针绑定,事实上我也是用map来实现的,所以不熟悉map的提前熟悉map的操作. Tire的逻辑比较抽象,所以如果是第一次见到这种组织方式的建议先熟悉熟悉这种逻辑再开始写代码,这样会比较顺畅. 代码如下:(仅供参考) 1 struct Node { 2 public : 3 bool isWord; 4 uno

常用算法之Trie【字典树,前缀树】

Trie中文名又叫做字典树,前缀树等,因为其结构独有的特点,经常被用来统计,排序,和保存大量的字符串,经常见于搜索提示,输入法文字关联等,当输入一个值,可以自动搜索出可能的选择.当没有完全匹配的结果时,可以返回前缀最为相似的可能. 其实腾讯的面试题有一个:如何匹配出拼写单词的正确拼写.其实用匹配树非常合适. 基本性质: 1.根节点不含有字符,其余各节点有且只有一个字符. 2.根节点到某一节点中经过的节点存储的值连接起来就是对应的字符串. 3.每一个节点所有的子节点的值都不应该相同. 借用一下维基

静态字典树模板

#include <iostream> #include <cstring> #include <cstdio> using namespace std; int pos; struct node { int child[26]; }tree[10000010]; int add() { pos++; for(int i=0;i<26;i++) { tree[pos].child[i]=-1; } return pos; } int inser(char* str