感觉空间能过啊,一直在第 7 个点 MLE。
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define re register
#define il inline
#define PII pair<int,pair<int,int>>
#define x first
#define y second
const int N=5e5+10,p=1e9+7,M=2e5+10;
string s[M];
int n,q;
unordered_map<int,int> cnt;
int id[M],idx;
int bk=191,Bk[M];
struct node{
int s,id,k;
bool fl;
}in[M];
int ans[N];
int hs[M],hs2[M];
vector<int> v;
il bool cmp(node a,node b){return a.s<b.s;
}
il int get(int len){
if(!id[len]) return v.push_back(len),id[len]=++idx;
return id[len];
}
il void solve(){
cin>>n>>q;int idx=0;
for(re int i=1,w;i<=n;++i) cin>>s[i],w=get((int)(s[i].size()));
for(re int i=1;i<=q;++i){
int l,r,k;cin>>l>>r>>k;if(l-1)in[++idx]={l-1,i,k,1};in[++idx]={r,i,k,0};
}sort(in+1,in+idx+1,cmp);int ss=1;
for(re int i=1;i<=n;++i){
for(re int j=0;j<s[i].size();++j)
if(j==0) hs2[i]=s[i][j]-'a'+1;
else hs2[i]=((long long)((long long)hs2[i]*bk%p)+s[i][j]-'a'+1)%p;
}
Bk[0]=1;for(re int i=1;i<=200000;++i) Bk[i]=(long long)((long long)Bk[i-1]*bk)%p;
for(re int i=1;i<=n;++i){
for(re int j=0;j<s[i].size();++j)
if(j==0) hs[j]=s[i][j]-'a'+1;
else hs[j]=((long long)((long long)hs[j-1]*bk%p)+s[i][j]-'a'+1)%p;
for(auto len:v){
for(re int l=0;l+len-1<s[i].size();++l){
int r=l+len-1;int now=0;
if(l==0) now=hs[r];
else now=((long long)((long long)((long long)hs[r]-(long long)((long long)hs[l-1]*(long long)Bk[len])%p)%p+p))%p;
//cnt.insert(now);
++cnt[now];
}
}
while(ss<=idx&&in[ss].s==i){
node now=in[ss];++ss;
//cout<<now.s<<" "<<now.k<<" "<<now.id<<" "<<now.fl<<"\n";
if(now.fl==1)
ans[now.id]-=cnt[hs2[now.k]];
else ans[now.id]+=cnt[hs2[now.k]];
}
}
for(re int i=1;i<=q;++i) cout<<ans[i]<<"\n";
return ;
}
signed main(){
// int t=1;/*cin>>t;*/while(t--)
solve();
return 0;
}