前缀统计
题目链接:前缀统计
题目描述
解题思路
这是 T r i e Trie Trie 树的模板题。
T r i e Trie Trie 树又名字典树,是哈希树的变种。
T
r
i
e
Trie
Trie 树说白了就是一颗边权为字符的树,从根节点向下到每一个标记的终点都是一个字符串,就像这样:
这里面一共有
3
3
3 个串:
m
d
,
m
y
c
,
n
b
md,myc,nb
md,myc,nb
当然这是数到底的情况,你可以定义一个变量用于储存终点。如果 4 4 4 是一个终点,那么这棵树里面就还有一个叫做 m y my my 的串。
其实 T r i e Trie Trie 树很好理解:存入串就是建树的过程;查找串就是遍历的过程。
code
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int n,m;
int v[1000010];
int a[1000010][26],tot=1;
void in(string s)
{
int l=s.size(),now=1;
for(int i=0;i<l;i++)
{
if(!a[now][s[i]-'a'])
tot++,a[now][s[i]-'a']=tot;
now=a[now][s[i]-'a'];
}
v[now]++;
}
int fd(string s)
{
int l=s.size(),now=1,ans=0;
for(int i=0;i<l;i++)
{
if(!a[now][s[i]-'a'])
break;
now=a[now][s[i]-'a'];
ans+=v[now];
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
in(s);
}
for(int i=1;i<=m;i++)
{
string s;
cin>>s;
cout<<fd(s)<<endl;
}
}