字典树(学思路)

int tire[(int)3e6+10][63];
int cnt[(int)3e6+10];
int get(char c){
    if(c>='a'&&c<='z') return c-'a';
    else if(c>='A'&&c<='Z') return 26+(c-'A');
    return 52+(c-'0');
}
void solve(){
         int n,q;cin>>n>>q;
         int idx=0;
         memset(tire, 0, sizeof(tire)); // 所有子节点指针置0
        memset(cnt, 0, sizeof(cnt));   // 所有计数置0
         auto built=[&](int u,string&s)->void{
               for(char c:s){
                   int nx=get(c);
                   if(!tire[u][nx]) tire[u][nx]=++idx;
                   u=tire[u][nx];
                   cnt[u]++;//前缀用这个,完全匹配的放外面
               }
         };
         for(int i=0;i<n;i++){
             string s;cin>>s;
             built(0,s);
         }
       while(q--){
         string ss;cin>>ss;
         int ans=0;
         auto query=[&](int u,string &s)->void{
              for(char c:s){
                 int nx=get(c);
                 if(!tire[u][nx]) return;
                 u=tire[u][nx];
              }
           ans=cnt[u];
         };
         query(0,ss);
         cout<<ans<<endl;
       }
}
posted @ 2025-06-09 15:40  Qacter  阅读(7)  评论(0)    收藏  举报