#include <bits/stdc++.h>
using namespace std;
int const BASE=31;
int const MOD=1e9+7;
int const MAX=2e5+5;
int sufix[MAX];
int ans[MAX];
int n,m;
int total_ev;
struct event{
string sir;
int id,type;
bool operator<(event ot){
if(sir==ot.sir)
return type>ot.type;
return sir<ot.sir;
}
}events[MAX];
map<int,int>mep;
void read(){
cin>>n>>m;
int i;
for(i=1;i<=n;++i){
string s;
cin>>s;
events[++total_ev]={s,0,0};
}
for(i=1;i<=m;++i){
string pref,suf;
cin>>pref>>suf;
events[++total_ev]={pref,i,1};
pref.push_back('Z');
events[++total_ev]={pref,i,2};
reverse(suf.begin(),suf.end());
int bpow=1;
int id;
int nr=0;
for(id=0;id<(int)suf.size();++id){
nr=(nr+1LL*bpow*(suf[id]-'A'+1)%MOD)%MOD;
bpow=1LL*bpow*BASE%MOD;
}
sufix[i]=nr;
}
sort(events+1,events+total_ev+1);
}
void solve(){
int i;
for(i=1;i<=total_ev;++i)
if(events[i].type==0){
int nr=0;
int id;
int bpow=1;
for(id=(int)events[i].sir.size()-1;id>=0;--id){
nr=(nr+1LL*bpow*(events[i].sir[id]-'A'+1)%MOD)%MOD;
++mep[nr];
bpow=1LL*bpow*BASE%MOD;
}
}
else
if(events[i].type==1)
ans[events[i].id]-=mep[sufix[events[i].id]];
else
ans[events[i].id]+=mep[sufix[events[i].id]];
}
void write(){
int i;
for(i=1;i<=m;++i)
cout<<ans[i]<<'\n';
}
int main()
{
read();
solve();
write();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |