用到了trie 就是建立一棵树然后将每个字符串放进去,最后来匹配, 具体看 y神视频就懂了;
C++ 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6+6;
int n, m;
char s[maxn]; //用来存每一次的数组
int son[maxn][26]; // 这个是建立的树
int cnt[maxn], idx; //cnt用来标记每个字符串的结尾, idx 用来记录树的末尾
void insert()
{
int p = 0;
for(int i = 0; i < strlen(s); i ++)
{
if(!son[p][s[i] - 'a']) son[p][s[i]-'a'] = ++ idx; //如果当前位置为空则将idx放入当前位置,然后idx加一
p = son[p][s[i]-'a']; //将儿子更新为父亲
}
cnt[p] ++; //循环一次insert 将字符串的末尾做上标记
}
int query()
{
int p = 0, res = 0;
for(int i = 0; i < strlen(s); i ++)
{
if(!son[p][s[i]-'a']) break; //如果当前为空了,则跳出就好
p = son[p][s[i]-'a'];
res += cnt[p]; //如果不为空,则加上当前的数组的个数
}
return res;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i ++)
{
scanf(" %s",&s);
insert();
}
for(int i = 1; i <= m; i ++)
{
scanf(" %s",s);
printf("%d\n",query());
}
return 0;
}