字典树
一种数据结构而已, 按照字符来储存, 通过以有的信息来优化空间, 从根节点到尾部来表示这个字符串
他的很多功能要利用 树上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; }