社区讨论
求助,全是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 条回复,欢迎继续交流。
正在加载回复...