萌新求助

P8306 【模板】字典树

SuperCowHorse @ 2022-08-12 14:20:19

RT。52pts,WA on #2,3,4。

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e6+5;
struct trie{
    int nex[maxn][63],cnt,tot[maxn];
    bool ex[maxn];
    int to_num(char c){
        if(c>='A'&&c<='Z')
            return c-'A';
        if(c>='a'&&c<='z')
            return c-'a'+26;
        return c-'0'+52;
    }
    void insert(char *s,int l){
        int p=0;
        for(int i=0;i<l;++i){
            int c=to_num(s[i]);
            if(!nex[p][c])
                nex[p][c]=++cnt;
            p=nex[p][c];++tot[p];
        }
        ex[p]=1;
    }
    int find(char *s,int l){
        int p=0;
        for(int i=0;i<l;++i){
            int c=to_num(s[i]);
            if(!nex[p][c]) return 0;
            p=nex[p][c];
        }
        return tot[p];
    }
    void init(){
        for(int i=1;i<=cnt;++i)
            for(int j=1;j<=62;++j)
                nex[i][j]=ex[i]=0;
        for(int i=1;i<=cnt;++i)
            tot[i]=0;
        cnt=0;
    }
}t;
int T,n,q;
char s[maxn];
int main(){
    scanf("%d",&T);
    while(T--){
        t.init();
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;++i){
            scanf("%s",s);
            t.insert(s,strlen(s));
        }
        while(q--){
            scanf("%s",s);
            printf("%d\n",t.find(s,strlen(s)));
        }
    }
}

by LKY928261 @ 2022-08-12 15:18:21

《红名萌新》

问:代码中的 ex 数组表示什么?


by SuperCowHorse @ 2022-08-12 15:19:36

@lvkaiyi0811 该结点结尾的字符串是否存在


by SuperCowHorse @ 2022-08-12 15:19:53

看的 OI-wiki


by LKY928261 @ 2022-08-12 15:23:12

改:

void init(){
    for(int i=1;i<=cnt;++i)for(int j=0;j<62;++j)nex[i][j]=ex[i]=0;
    for(int i=1;i<=cnt;++i)tot[i]=0;
    cnt=0;
}

你的标号是从 0 开始的。


by LKY928261 @ 2022-08-12 15:27:53

@chenye3


by SuperCowHorse @ 2022-08-12 15:50:54

@lvkaiyi0811 AC了。

void init(){
    for(int i=0;i<=cnt;++i)for(int j=0;j<62;++j)nex[i][j]=ex[i]=0;
    for(int i=0;i<=cnt;++i)tot[i]=0;
    cnt=0;
}

by SuperCowHorse @ 2022-08-12 15:51:12

谢谢dalao


|