牛客:前缀统计 Trie模板题

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

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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; 
}
/**/

你可能感兴趣的:(字符串)