牛客:前缀统计 Trie模板题

    技术2025-03-22  24

    题目链接:前缀统计 思路: 可以把这N个字符串插入一棵Trie字典树,Trie树的每个节点上存储一个整数ans,记录该节点是多少个字符串的末尾节点。对于每个询问,在Trie 树中检索T,在检索过程中累加途径的每个节点的cnt值,就是该询问的答案 代码:

    #include<iostream> #include<set> #include<vector> #include<queue> #include<string.h> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<map> using namespace std; typedef long long int ll; using namespace std; const int MAX = 2e5 + 5; int trie[MAX][26],tot=1,b[MAX]; char a[MAX]; void insert(char a[]) { int len=strlen(a),p=1; for(int k=0;k<len;k++) { int ch=a[k]-'a'; if(trie[p][ch]==0)trie[p][ch]=++tot; p=trie[p][ch]; } b[p]++; } int find(char a[]) { int n=strlen(a); int sum=0,p=1; for(int k=0;k<n;k++) { p=trie[p][a[k]-'a']; if(p==0)break; sum+=b[p]; } return sum; } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%s",a); insert(a); } for(int i=0;i<m;i++) { scanf("%s",a); printf("%d\n",find(a)); } return 0; } /**/
    Processed: 0.011, SQL: 9