给定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
板子题,记录一下板子,还有一种数组的写法,不过不好理解,空间复杂度好像也比这种指针的高
#include<bits/stdc++.h>
#define N 1000010
using namespace std;
typedef struct Node{
int tail=0; //字符串结尾
vector<Node*> next;
vector<int> cnt;
Node()
{
next.assign(26, NULL); //推进去26个element
cnt.assign(26, 0);
}
};
Node *root = new Node();
int n,m;
void insert(string s){
Node* p=root;
for(int i=0;i<s.size();i++){
int ch = s[i]-'a';
if(!p->next[ch]) p->next[ch]=new Node();
p->cnt[ch]++;
p = p->next[ch];
}
p->tail++;
}
int search(string s){
Node *p = root;
int ans = 0;
for(int i=0;i<s.size();i++){
int ch = s[i]-'a';
ans += p->tail;
if(!p->next[ch]) return ans;
p = p->next[ch];
}
ans += p->tail;
return ans;
}
int main(){
cin>>n>>m;
string s;
for(int i=0;i<n;i++){
cin>>s;
insert(s);
}
for(int i=0;i<m;i++){
cin>>s;
int res = search(s);
cout<<res<<endl;
}
return 0;
}