• 字典树(tire树)


     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 
     5 using namespace std;
     6 
     7 struct node
     8 {
     9     int next[26];
    10     int cnt;
    11     void init()
    12     {
    13         cnt=0;
    14         memset(next,-1,sizeof(next));
    15     }
    16 }T[1000000];
    17 
    18 int le;  //第几个字典序
    19 
    20 void insert(char *s)
    21 {
    22     int i=0,p=0;
    23     while(s[i])
    24     {
    25         int x=s[i]-'a';
    26         if(T[p].next[x]==-1)
    27         {
    28             T[le].init(); 
    29             T[p].next[x] = le++;
    30         }
    31         p=T[p].next[x];
    32         T[p].cnt++;
    33         i++;
    34     }
    35 }
    36 void query(char *s)
    37 {
    38     int i=0,p=0;
    39     while(s[i])
    40     {
    41         int x=s[i]-'a';
    42         if(T[p].next[x]==-1)
    43         {
    44             puts("0");
    45             return ;
    46         }
    47         p=T[p].next[x];
    48         i++;
    49     }
    50     printf("%d
    ",T[p].cnt);
    51 }
    52 int main()
    53 {
    54     int n,m;
    55     char str[20];
    56     scanf("%d",&n);
    57     le=1;
    58     T[0].init();
    59     while(n--) {
    60         scanf("%s",str);
    61         insert(str);
    62     }
    63     scanf("%d",&m);
    64     while(m--) {
    65         scanf("%s",str);
    66         query(str);
    67     }
    68 }
    代码君
    const int maxn = 6e5 + 20;
    const int sigma_size = 3;
     
    struct Node {
        int cnt;
        bool isEnd;
        Node *next[sigma_size];
    } trie[maxn];
     
    typedef Node Trie;
    int cnt_node = 0;
     
    void insert_Trie (char *str, Trie *root) {
        root -> cnt ++;
        if (str[0] == 0) {
            root -> isEnd = 1;
            return ;
        }
        if (root -> next[str[0] - 'a'] == 0) {
            cnt_node ++;
            root -> next[str[0] - 'a'] = trie + cnt_node;
            root -> isEnd = 0;
        }
        insert_Trie (str + 1, root -> next[str[0] - 'a']);
    }
    

      

  • 相关阅读:
    Service Mesh vs SideCar
    云原生应用
    js 中继承的几种方式
    js 中call,apply,bind的区别
    js中的原型
    ES6 中的let 声明变量
    react native 中的redux
    css 中的伪类选择器before 与after
    js中数组遍历的几种方法及其区别
    js中一些常见写法的含义
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4160657.html
Copyright © 2020-2023  润新知