求条MLE
查看原帖
求条MLE
1238611
harmis_yz楼主2023/12/21 16:26

感觉空间能过啊,一直在第 77 个点 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;
}
2023/12/21 16:26
加载中...