#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... |