前缀统计
题目
解析
字典树(trie):
一种用于实现字符串快速检索的多叉树结构,空间复杂度为
O
(
N
S
)
O(NS)
O(NS),支持插入/检索
它的插入/检索方法是这样的:
初始时设当前节点为1,然后扫描该字符串,每扫描到一个字符,就从当前节点走向对应的子节点,若没有子节点,则采用类似于线段树动态开点的方法,新建一个节点
它的优势是什么呢?
1,实现简单
2,可以线性检索前缀
学会这一点后,我们只需要插入N个字符串,再检索一遍就可以了
code:
#include<iostream>
#include<cstring>
#include<cstdio>
#define rr register int
using namespace std;
struct trie
{
int ch[1000010][26],bo[1000010],tot=1;
inline void insert(char* s)
{
int len=strlen(s),p=1;
for(rr i=0;i<len;++i)p=(ch[p][s[i]-'a'])?(ch[p][s[i]-'a']):(ch[p][s[i]-'a']=++tot);
++bo[p];
}
inline int ask(char *s)
{
int len=strlen(s),p=1,ans=0;
for(rr i=0;i<len;++i){p=ch[p][s[i]-'a'];if(p)ans+=bo[p];else return ans;}
return ans;
}
}AC;
int n,m;
char a[1000010];
int main()
{
scanf("%d%d",&n,&m);
while(n--)cin>>a,AC.insert(a);
while(m--)cin>>a,printf("%d\n",AC.ask(a));
return 0;
}