36WA求调

P8306 【模板】字典树

meifan666 @ 2024-09-26 21:57:04

#include <bits/stdc++.h>
#define int long long
using namespace std;
int T,n,q;
string s;
int cnt,ans;
int son[3000100][70];
int many[3000100];

void insert(string a){
    int p=0,len=a.size();
    for(int i=0;i<len;i++){
        if(!son[p][a[i]-'0'])son[p][a[i]-'0']=++cnt;
        p=son[p][a[i]-'0'];
        many[p]++;
    }
}
int find(string a){
    int p=0,len=a.size();
    for(int i=0;i<len;i++){
        if(!son[p][a[i]-'0'])return 0;
        p=son[p][a[i]-'0'];
    }
    return many[p];
}
signed main() {
    cin>>T;
    while(T--){
        cin>>n>>q;
        for(int i=0;i<=cnt;i++){
            many[i]=0;
            for(int j=0;j<70;j++)son[i][j]=0;
        }
        cnt=0;
        while(n--){
            cin>>s;
            insert(s);
        }
        while(q--){
            cin>>s;
            cout<<find(s)<<'\n';
        }
    }
    return 0;
}

by HEROBRINEH @ 2024-09-26 21:58:46

AC求关


#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
int n,q,cnt;
int v[3000005],tr[3000005][70];
int turn(char c){
    int b;
    if(c>='a'&&c<='z')b=c-'a';
    else if(c>='A'&&c<='Z')b=c-'A'+26;
    else b=c-'0'+52;
    return b;
}
signed main(){
    cin>>T;
    while(T--){
        for(int i=0;i<=cnt;i++){
            v[i]=0;
            for(int j=0;j<=125;j++){
                tr[i][j]=0;
            }
        }
        cnt=0;
        cin>>n>>q;
        for(int i=1;i<=n;i++){
            string s;
            cin>>s;
            int root=0;
            for(int j=0;j<s.size();j++){
                int c=turn(s[j]);
                if(tr[root][c]==0){
                    cnt++;
                    tr[root][c]=cnt;
                    root=cnt;
                }
                else{
                    root=tr[root][c];
                }
                v[root]++;
            }
        }
        while(q--){
            string s;
            cin>>s;
            int root=0;
            bool z=0;
            for(int j=0;j<s.size();j++){
                int c=turn(s[j]);
                if(tr[root][c]==0){
                    z=1;
                    break;
                }
                root=tr[root][c];
            }
            if(z==0)cout<<v[root]<<endl;
            else cout<<0<<endl;
        }
    }
    return 0;
}

by meifan666 @ 2024-09-26 22:00:41

@HEROBRINEH 可以再源代码改吗,我想看看哪不对


by meifan666 @ 2024-09-27 21:55:34

@meifan666 字符映射后AC,此帖结


|