悬赏三个关注求Hack
查看原帖
悬赏三个关注求Hack
761125
Milthm楼主2023/8/29 10:29

我都调了不知道多久,快趋势了,怎么都想不明白。

TLE就算了,为啥还有WA和RE啊(

求一个Hack

#include<iostream>
#include<cstring>
#define int long long
using namespace std;
char s[5005][5005],s2[5005][5005];
int n,qw,jie,len[50005],nxt[50005],qwq[50005],xun,xun2=1,t;
int syx[50005],cnt,zhan[50005];
int check(int x,int y){
	if(s[x][y]=='l'&&s[x][y+1]=='o')return 1;//loop
	if(s[x][y]=='c'&&s[x][y+1]=='o')return 2;//continue
	if(s[x][y]=='w'&&s[x][y+1]=='r')return 3;//write
	if(s[x][y]=='b'&&s[x][y+1]=='r')return 4;//break
	if(s[x][y]=='s'&&s[x][y+1]=='t')return 5;//start
	if(s[x][y]=='e'&&s[x][y+1]=='n')return 6;//end
	return 0;
}
void exfor(){ 
	for(int i=1;i<=n;++i)zhan[i]=0;
	t=0;
	for(int i=2;i<n;++i){
		if(check(i,1)==1){
			zhan[++t]=i;
		}
		else if(check(i,1)==6){
			nxt[zhan[t]]=i;
			t--;
		}
	}
}
void exc(int now,int l,int r){
	for(int i=1;i<=len[now];++i)zhan[i]=0;
	t=0;
	for(int i=1;i<=len[now];++i)qwq[i]=0;
	for(int j=1;j<=len[now];++j){
		if(s[now][j]=='('){
			zhan[++t]=j;
		}
		else if(s[now][j]==')'){
			qwq[zhan[t]]=j;
			t--;
		}
	}
}
int calc(int now,int l,int r){
	int jia=0,cheng=0,isj=0,isc=0;
	if(l==r&&s[now][l]>='a'&&s[now][l]<='z')return syx[s[now][l]-'a'];
	if(s[now][l]=='('&&s[now][r]==')'&&qwq[l]==r){
		return calc(now,l+1,r-1);
	}
	for(int i=l;i<=r;++i){
		if(s[now][i]=='+')jia=i,isj=1;
		else if(s[now][i]=='-')jia=i,isj=0;
		else if(s[now][i]=='*')cheng=i,isc=1;
		else if(s[now][i]=='/')cheng=i,isc=0;
		else if(s[now][i]=='(')i=qwq[i]-1;
	}
	if(jia!=0){
		if(isj)return calc(now,l,jia-1)+calc(now,jia+1,r);
		else return calc(now,l,jia-1)-calc(now,jia+1,r);
	}
	else if(cheng!=0){
		if(isc)return calc(now,l,cheng-1)*calc(now,cheng+1,r);
		else return calc(now,l,cheng-1)/calc(now,cheng+1,r);
	}
	else{
		int sum=0;
		for(int i=l;i<=r;++i){
			sum=sum*10+s[now][i]-'0';
		}
		return sum;
	}
}
int run(int now);
int For(int now,int k);
signed main(){
	while(cin.getline(s[++n],5000)){    
		len[n]=strlen(s[n]);
		for(int i=len[n];i>=1;--i)s[n][i]=s[n][i-1];
		s[n][0]=' ';
       // if(n==9)break;
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=len[i];++j)s2[i][j]=s[i][j];
		int qwq=0;
		for(int j=1;j<=len[i];++j)if(s2[i][j]!=' '&&s2[i][j]!='	'&&s2[i][j]!='\n'&&s2[i][j]!='\r')s[i][++qwq]=s2[i][j];
		for(int j=qwq+1;j<=len[i];++j)s[i][j]=' ';
		s[i][qwq+1]='\0';
		len[i]=qwq;
	}
	//--n; 
	exfor(); 
	for(int i=2;i<n;){
		int p=i;
		i=run(i);
		if(i<=p)i=p+1;
	}
	return 0;
}
int run(int now){
	int k=check(now,1);
	if(k==1){
		int dabc=5;
		while(s[now][dabc]==' ')++dabc;
		exc(now,dabc,len[now]);
		int o=For(now,calc(now,dabc,len[now]));
		//cout<<o<<'\n'; 
		return o;
	}
	else if(k==3){
		int dabc=6;
		while(s[now][dabc]==' ')++dabc;
		exc(now,dabc,len[now]);
		printf("%lld\n",calc(now,dabc,len[now]));
	}
	else{
		int dabc=3;
		exc(now,dabc,len[now]);
		while(s[now][dabc]==' ')++dabc;
		syx[s[now][1]-'a']=calc(now,dabc,len[now]);
	}
	return now+1;
}
int For(int now,int k){
	xun2*=k;
	bool fff=0;
	while(k--){
		for(int i=now+1;i<nxt[now];){
			if(check(i,1)==2)break;
			if(check(i,1)==4){
				return nxt[now]+1;
			}
			int p=i;
			i=run(i);
			if(i<=p)i=p+1;
		}
	}
	xun+=xun2;xun2/=k;
	return nxt[now]+1;
}
2023/8/29 10:29
加载中...