萌新求助 SA MLE QAQ
查看原帖
萌新求助 SA MLE QAQ
35891
huangzirui楼主2020/6/12 20:04

经过一个小时的卡常以后成功的在使用 vector 的情况下没有 TLE

但是 MLE 了QAQ

所以 vector 在 clear 以后不会重新算内存么QAQ

#include <bits/stdc++.h>
#define ll long long
#define Mid ((L+R)>>1)
using namespace std;
typedef pair<int,int> pii;
inline int read(){
	char c;int x=0;int b=1;do{c=getchar();if(c==45)b=-1;}while(c>57||c<48);
	do x=x*10+c-48,c=getchar();while(c<=57&&c>=48);x*=b;return x;
}
const int maxn=1000010;
int a[maxn],s[maxn][2],tmp[maxn][3],w[maxn];
vector<int>t[maxn];
string S;
int tmp2[maxn][2];
map<char,int>M;
int main() {
	register int i,j,k,n,m,cnt=0,Mx;
	freopen("P3809.in","r",stdin);
	freopen("P3809.out","w",stdout);
	for(i='0';i<='9';i++)M[i]=++cnt;
	for(i='A';i<='Z';i++)M[i]=++cnt;
	for(i='a';i<='z';i++)M[i]=++cnt;
	getline(cin,S);n=S.size();
	for(i=1;i<=n;i++){a[i]=s[i][0]=M[S[i-1]];}
	for(int l=1;cnt!=n;l<<=1){
		cnt=Mx=0;
		for(i=1;i<=n;++i){
			if(i+l<=n)s[i][1]=s[i+l][0];
			else s[i][1]=0;
			t[s[i][1]].push_back(i);
			Mx=max(Mx,s[i][0]);
		}
		for(i=0;i<=Mx;++i){
			int len=t[i].size();
			for(j=0;j<len;++j){
				int now=t[i][j];
				w[++cnt]=now;
			}
			t[i].clear();
		}
		for(i=1;i<=n;++i){
			tmp[i][0]=s[w[i]][0];tmp[i][1]=s[w[i]][1];tmp[i][2]=w[i];
			t[tmp[i][0]].push_back(i);
		}
		cnt=0;
		for(i=0;i<=Mx;++i){
			int len=t[i].size();
			for(j=0;j<len;++j){
				int now=t[i][j];
				w[++cnt]=now;
			}
			t[i].clear();
		}
		for(i=1;i<=n;i++)tmp2[i][0]=tmp[w[i]][0],tmp2[i][1]=tmp[w[i]][1];
/*
		for(i=1;i<=n;i++)cout<<tmp2[i][0]<<' '<<tmp2[i][1]<<' '<<tmp2[i][2]<<endl;cout<<endl;
*/
		cnt=0;
		for(i=1;i<=n;++i){
			if(tmp2[i][0]^tmp2[i-1][0] || tmp2[i][1]^tmp2[i-1][1])++cnt;
			tmp[i][0]=cnt;
		}
		for(i=1;i<=n;++i)s[tmp[w[i]][2]][0]=tmp[i][0];
	}
	memset(tmp,0,sizeof(tmp));
	for(i=1;i<=n;i++)tmp[s[i][0]][0]=i;
	for(i=1;i<=n;i++)printf("%d ",tmp[i][0]);
	cout<<endl;
	//cerr << 1.0*clock()/CLOCKS_PER_SEC << endl;
	return 0;
}

2020/6/12 20:04
加载中...