字典树

一种数据结构而已, 按照字符来储存, 通过以有的信息来优化空间, 从根节点到尾部来表示这个字符串

他的很多功能要利用 树上DP的思想去使用

 

 

#include <bits/stdc++.h>
using namespace std;
#define ri int
#define M 3000005

int n,m;
int T;
struct node{
    int nxt[140];
    int val;
}p[M];
int cnt;
void add(string s)
{
    int now=0;
    for(ri i=0;i<s.length();i++)
    {
        if(p[now].nxt[s[i]-47])
        {
            now=p[now].nxt[s[i]-47];
            p[now].val++;
        }
        else p[now].nxt[s[i]-47]=++cnt,p[cnt].val=1,now=cnt;
    }
}
int qu(string s)
{
    int now=0;
    int ans=0;
    for(ri i=0;i<s.length();i++)
    {
        if(p[now].nxt[s[i]-47])
        {
            now=p[now].nxt[s[i]-47];
            ans=p[now].val;
        }
        else return 0;
    }
    return ans;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        for(ri i=0;i<=cnt;i++)
        {
            for(ri j=0;j<=140;j++)
            p[i].nxt[j]=0,p[i].val=0;
        }
        cnt=0;
        for(ri i=1;i<=n;i++)
        {
            string s;
            cin>>s;
            add(s);
        }
        for(ri i=1;i<=m;i++)
        {
            string s;
            cin>>s;
            cout<<qu(s)<<"\n";
        }
    }
    
    return 0;

}
View Code

 

posted @ 2023-03-03 23:49  VxiaohuanV  阅读(11)  评论(0编辑  收藏  举报