我都调了不知道多久,快趋势了,怎么都想不明白。
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;
}