字典树模板RE求调悬棺

P8306 【模板】字典树

shoot_down @ 2023-08-24 20:28:56

#include<bits/stdc++.h>
using namespace std;
int cnt[70],tr[3000001][70],tot;
int cal(char x){
    if(x>='A'&&x<='Z')
        return x-'A';
    else if(x>='a'&&x<='z')
        return x-'a'+26;
    else
        return x-'0'+52;
//  return a>='A'&&a<='Z'?a-'A':a>='a'&&a<='z'?a-'a'+26:a-'0'+52;
}
void build(string a){
    int u=0,sa=a.size();
    for(int i=0;i<sa;i++){
        int x=cal(a[i]);
        if(!tr[u][x]) tr[u][x]=++tot;
        u=tr[u][x];
        cnt[u]++;
    }
}
int query(string a){
    int u=0,sa=a.size();
    for(int i=0;i<sa;i++){
        int x=cal(a[i]);
        if(!tr[u][x]) return 0;
        u=tr[u][x];
    }
    return cnt[u];
}
int main(){
//  freopen("P8306_1.in","r",stdin);
//  freopen("ans.out","w",stdout);
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while(T--){
        for(int i=0;i<=tot;i++) for(int j=0;j<=65;j++) tr[i][j]=0;
        for(int i=0;i<=tot;i++) cnt[i]=0;
        tot=0;
        int n,m;
        cin>>n>>m;
        string a;
        for(int i=1;i<=n;i++) cin>>a,build(a);
        for(int i=1;i<=m;i++) cin>>a,cout<<query(a)<<'\n';
    }
    return 0;
}

by Gambler_Super @ 2023-08-24 20:31:47

'Z'的ASCLL码〉70


by shoot_down @ 2023-08-24 20:34:21

@xue51huyuchuan 不是这个问题,应为z会在cal函数里重新计算。而是cnt数组开小了。


by shoot_down @ 2023-08-24 20:34:46

此贴结。


by TankYu @ 2023-08-24 20:35:16

@shoot_down cnt开这么小?


by shoot_down @ 2023-08-24 20:38:11

@TankYu 失误。

另外问一下为什么第一篇题解的初始化没有RE,t[i][j]的j不会溢出吗?


by TankYu @ 2023-08-24 20:44:49

@shoot_down 能越界越到一个数组就不会RE

这是我调错3小时的教训


by TankYu @ 2023-08-24 20:46:38

@shoot_down 事实上越界如果不访问野指针是不会RE的

而这个二维数组内存连续,于是它可能越界到了这个二维数组的某个地方,或者下一块内存cnt的某个地方,不会RE


|