社区讨论

求助,全是Runtime Error(^.^)!

P1054[NOIP 2005 提高组] 等价表达式参与者 2已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi7cxown
此快照首次捕获于
2025/11/20 19:38
4 个月前
此快照最后确认于
2025/11/20 19:38
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define f(a) (a<<3)+(a<<1)
#define Get(ch) ans[tot++]=ch
#define Duck sta.top(); sta.pop()
#define Isnbr(ch) (ch>='0' && ch<='9')
#define __Memset(s) for(int i=0;i<=2*len+1;s[i++]='\0')
int n,yxj[1<<7];
const int maxn=2e2+5;
inline void Hzbds(char *s){//前缀转后缀
    stack<char> sta;
    bool Inside=false;
    char ans[maxn]={0};
    int cnt=0,nbr=0,tot=0;
    int len=strlen(s),a[maxn];
    for(int i=0;i<=len;i++){
        if(Isnbr(s[i]) && i!=len){
            Inside=true;
            nbr=f(nbr)+(s[i]-'0');
        }
        else if(s[i]!=' ' || i==len){
            if(isalpha(s[i])){
                Get(s[i]);
                Get(' ');
                continue;
            }
            if(Inside){
                do{
                    a[++cnt]=nbr%10;
                }while(nbr/=10);
                for(int j=cnt;j>=1;j--)
                    Get(a[j]+'0');
                Get(' '),cnt=0;
                Inside=false;
            }
            if(i==len) break;
            while(!sta.empty()){
                char nxt=sta.top();
                if(nxt=='(' && s[i]==')'){
                    sta.pop();
                    break;
                }
                else if(yxj[(int)s[i]]>=yxj[(int)nxt]){
                    if(nxt=='('){
                        sta.push(s[i]);
                        break;
                    }
                    Get(nxt);
                    Get(' ');
                    sta.pop();
                }
                else {
                    sta.push(s[i]);
                    break;
                }
            }
            if(sta.empty() && s[i]!=')')
                sta.push(s[i]);
        }
    }
    while(!sta.empty()){
        char nxt=sta.top();
        Get(nxt);
        Get(' ');
        sta.pop();
    }
    __Memset(s);
    while((--tot)>=0)
        s[tot]=ans[tot];
}
#define lli long long int
inline lli Fast_pow(lli a,lli b){//龟速幂
    lli __rtn=1;
    while(b--)
        __rtn*=a;
    return __rtn;
}
inline lli Get_ans(char *s,int nbr){//后缀求值
    stack<lli> sta;
    lli __rtn=0,ans=0;
    int len=strlen(s);
    bool Inside=false;
    for(int i=0;i<=len-1;i++){
        if(Isnbr(s[i])){
            Inside=true;
            ans=f(ans)+(s[i]-'0');
        }
        else if(s[i]==' ' && Inside)
            sta.push(ans),ans=0;
        else if(isalpha(s[i]))
            ans=nbr,Inside=true;
        else if(s[i]!=' '){
            lli nx2=Duck;
            lli nx1=Duck;
            Inside=false;
            if(s[i]=='+') __rtn=nx1+nx2;
            if(s[i]=='-') __rtn=nx1-nx2;
            if(s[i]=='*') __rtn=nx1*nx2;
            if(s[i]=='/') __rtn=nx1/nx2;
            if(s[i]=='^') __rtn=Fast_pow(nx1,nx2);
            sta.push(__rtn);
        }
    }
    return sta.top();
}
lli ans[26+5][10+5];
char s[maxn],ch[26+5][maxn];
inline int Fast_Read(){//快读
    int ret=0;
    char ch=getchar();
    while(!Isnbr(ch))
        ch=getchar();
    while(Isnbr(ch)){
        ret=f(ret)+(ch-'0');
        ch=getchar();
    }
    return ret;
}
int main(){
    yxj['(']=1;
    yxj['^']=2;
    yxj['*']=3;
    yxj['/']=3;
    yxj['+']=4;
    yxj['-']=4;
    yxj[')']=5;
    for(int i=0;i<=n;i++){
    	for(int j=0;;j+=2){
            ch[i][j]=getchar();
            if(ch[i][j--]=='\n'){
                ch[i][++j]='\0';
                break;
            }
        }
        Hzbds(ch[i]);
        if(i==0)
            n=Fast_Read();
    }
    for(int i=0;i<=10;i++)
    	for(int j=0;j<=n;j++)
    		ans[j][i]=Get_ans(ch[j],i);
    for(int i=1;i<=n;i++){
    	bool pd=false;
    	for(int j=0;j<=10;j++)
    		if(ans[i][j]!=ans[0][j]){
    			pd=true;
    			break;
    		}
    	if(pd==false)
    		printf("%c",i+'A'-1);
    }
    return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...