题目链接:https://www.acwing.com/problem/content/144/
题意: 给定N个字符串S1,S2…SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1~SNSN中有多少个字符串是T的前缀。
思路:可以把这N个字符串插入一棵Trie字典树,Trie树的每个节点上存储一个整数ans,记录该节点是多少个字符串的末尾节点。对于每个询问,在Trie
树中检索T,在检索过程中累加途径的每个节点的cnt值,就是该询问的答案
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int trie[1000010][30],b[1000010]; int tot=1; char a[1000010]; void insert(char a[]) { int n=strlen(a); int p=1; for(int i=0;i<n;i++) { int w=a[i]-'a'; if(trie[p][w]==0) trie[p][w]=++tot; p=trie[p][w]; } b[p]++; return; } int fun(char a[]) { int n=strlen(a); int sum=0,p=1; for(int i=0;i<n;i++) { int w=a[i]-'a'; if(trie[p][w]==0) break; p=trie[p][w]; 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); int sum=fun(a); printf("%d ",sum); } return 0; }