滥用指针导致了MLE,但是我不理解

P8306 【模板】字典树

Mecci_miaowu @ 2023-12-08 12:57:43

如题,我每次干完都进行了delete操作,为什么还导致了MLE?


#include<bits/stdc++.h>
using i64 = long long;

struct node{
    int cnt = 0;
    node *nxt[75] = {};
};

int hash(char ch){
    if(ch >= '0' && ch <= '9')return ch - '0' + 52;
    if(ch >= 'a' && ch <= 'z')return ch - 'a';
    return ch - 'A' + 26;
}

void insert(int id, std::string s, node *root){
    ++root -> cnt;
    if(id == s.length())return;
    int h = hash(s[id]);
    if(root -> nxt[h] == NULL)root -> nxt[h] = new node;
    insert(id + 1, s, root -> nxt[h]);
}

int query(int id, std::string s, node *root){
    if(id == s.length())return root -> cnt;
    int h = hash(s[id]);
    if(root -> nxt[h] == NULL)return 0;
    return query(id + 1, s, root -> nxt[h]);
}

void del(node *root){
    for(int i = 0; i < 75; ++i)if(root -> nxt[i] != NULL)del(root -> nxt[i]);
    delete root;
}

int main(){
    std::ios::sync_with_stdio(0);
    std::cin.tie(0);

    int t;
    std::cin >> t;
    while(t--){
        node *root = new node;
        int n, q;
        std::cin >> n >> q;
        while(n--){
            std::string s;
            std::cin >> s;
            insert(0, s, root);
        }
        while(q--){
            std::string s;
            std::cin >> s;
            std::cout << query(0, s, root) << '\n';
        }
        del(root);
    }

    return 0;
}

by fp0cy1tz6mn4rd_ @ 2023-12-08 13:01:01

@Mecci_miaowu 以我的理解是他只给你那么多空间,你在创建的过程中就已经存不下了


by Mecci_miaowu @ 2023-12-08 13:04:14

@public_sickle 我delete以后那些空间就不能够被重复利用了吗


by Mecci_miaowu @ 2023-12-08 13:05:39

@public_sickle 刚刚测试了不加del()函数的话就有5个MLE了


by fp0cy1tz6mn4rd_ @ 2023-12-08 13:07:43

@Mecci_miaowu 可能占用的空间确实太多,不是重复不重复利用的问题了


by Mecci_miaowu @ 2023-12-08 13:40:17

@public_sickle 把结构体里面那个nxt数组大小改成62 刚刚好的情况 竟然过了


by fp0cy1tz6mn4rd_ @ 2023-12-08 13:41:30

@Mecci_miaowu 所以应该是占用空间的问题了


|