查询前缀串出现次数 字典树

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long L;
char s[200001];
int  trie[200001][58],tot=0;
int ed[200001];
void init()
{
    for(int i=0;i<=tot;i++) for(int j=0;j<58;j++) trie[i][j]=0;
    for(int i=0;i<=tot;i++) ed[i]=0;
}
void add(char a[])
{
    int len=strlen(a),p=0;
    for(int i=0;i<len;i++){
        int c=a[i]-'A';
        if(!trie[p][c]){
            trie[p][c]=++tot;
        }
        p=trie[p][c];
    }
    ed[p]++;
}
int query(char a[])
{
    int len=strlen(a),p=0,ans=ed[p];
    for(int i=0;i<len;i++){
        int c=a[i]-'A';
        if(!trie[p][c]){
            return ans;
        }
        p=trie[p][c];
        ans+=ed[p];
    }
    return ans;
}
int main()
{
     int t;scanf("%d",&t);
     while(t--){
        init();
        int n;scanf("%d",&n);tot=0;
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            add(s);
        }
        int q;scanf("%d",&q);
        while(q--){
            scanf("%s",s);
            printf("%d-----\n",query(s));
        }
     }
}

发布了61 篇原创文章 · 获赞 7 · 访问量 3199

猜你喜欢

转载自blog.csdn.net/qq_43914084/article/details/102964865
今日推荐