题目描述
给定N个字符串S1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1~SN中有多少个字符串是T的前缀。
输入字符串的总长度不超过106,仅包含小写字母。
输入格式
第一行输入两个整数N,M。
接下来N行每行输入一个字符串Si。
接下来M行每行一个字符串T用以询问。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
样例
输入样例:
3 2
ab
bc
abc
abc
efg
输出样例:
2
0
字典树
统计前缀个数,一想到字符串的前缀,我们就应该想到字典树,这个和字典一样的前缀树.
这道题目是字典树模板的略微改动,我们发现这道题目和一般字典树的查询不一样,字典树一般查询是看这个字符串是否出现,而这道题目这是统计这个字符串出现的次数.
C++ 代码
#include <bits/stdc++.h>
using namespace std;
#define fir(i,a,b) for(int i=a;i<=b;i++)
const int N=1e6+10;
char str[N];
int trie[N][26],n,m,i,j,t,End[N],tot=1;
void insert(char a[])
{
int len=strlen(a),p=1;
fir(i,0,len-1)
{
int ch=a[i]-'a';
if (trie[p][ch]==0)
trie[p][ch]=(++tot);
p=trie[p][ch];
}
End[p]++;//统计个数
}
int Search(char a[])
{
int len=strlen(a),p=1,ans=0;
fir(i,0,len-1)//把这个字符串所有的前缀都找出来
{
p=trie[p][a[i]-'a'];
if (p==0)
return ans;
ans+=End[p];
}
return ans;
}
int main()
{
scanf("%d%d\n",&n,&t);
fir(i,0,n-1)
{
scanf("%s\n",str);
insert(str);
}
while(t--)
{
scanf("%s\n",str);
printf("%d\n",Search(str));
}
return 0;
}
题目大意是,在T中看S是不是它的前缀,
为什么是插入S,查询T,
而不是插入T,查询S呢?
求助大佬
请问fir是什么
for integer range (i,a,b) . 整数i在a b见循环。
猜的
最上面有宏定义
###Orz