萌新求助,等价表达式这题,本机AC,提交WA
查看原帖
萌新求助,等价表达式这题,本机AC,提交WA
536439
YONIC楼主2022/8/10 22:07

WA了后面的四个点

#include<bits/stdc++.h>
#define int long long
#define mod 1000000009
using namespace std;
int n;
bool f[27];
string s,p[27];
struct node{int unknown,res;}data[11];
string func(string t){
	string y="";
	for(int i=0;i<t.length();++i) if(t[i]!=' ') y+=t[i];
	return y;
}
int Qpow(int z,int e){
	if(!e) return 1;
	if(e==1) return z%mod;
	if(e%2) return (Qpow(z,e/2)*Qpow(z,e/2+1))%mod;
	else return (Qpow(z,e/2)*Qpow(z,e/2))%mod;
}
int calc(string t,int a){
	int opcnt=0,prrt=0,p[51],id=0;
	memset(p,0x7f,sizeof(p));
	for(int i=t.length()-1;i>=0;--i){
		if(t[i]=='(') prrt-=65536;
		if(t[i]==')') prrt+=65536;
		if(t[i]=='+') p[i]=prrt+1,opcnt=1;
		if(t[i]=='-') p[i]=prrt+1,opcnt=1;
		if(t[i]=='*') p[i]=prrt+2,opcnt=1;
		if(t[i]=='^') p[i]=prrt+3,opcnt=1;
		if(p[i]<p[id]) id=i;
	}
	if(!opcnt){
		int x=0;
		for(int i=0;i<t.length();++i) if(t[i]=='a') return a;
		for(int i=0;i<t.length();++i) if(isdigit(t[i])) x=(x<<3)+(x<<1)+t[i]-48;
		return x;
	}
	if(t[id]=='^') return Qpow(calc(t.substr(0,id),a),calc(t.substr(id+1,t.length()-id-1),a));
	if(t[id]=='*') return calc(t.substr(0,id),a)*calc(t.substr(id+1,t.length()-id-1),a)%mod;
	if(t[id]=='+') return calc(t.substr(0,id),a)+calc(t.substr(id+1,t.length()-id-1),a)%mod;
	if(t[id]=='-') return calc(t.substr(0,id),a)-calc(t.substr(id+1,t.length()-id-1),a)%mod;
}
signed main(){
	srand(time(NULL));
	for(int i=1;i<=n;++i) data[i].unknown=rand();
	getline(cin,s);
	s=func(s);
	for(int i=1;i<=10;++i) data[i].res=calc(s,data[i].unknown);
	scanf("%lld",&n);
    getchar();
    getchar();
	for(int i=1;i<=n;++i){
		f[i]=1;
		getline(cin,p[i]);
		p[i]=func(p[i]);
		for(int j=1;j<=10;++j) if(calc(p[i],data[j].unknown)!=data[j].res) f[i]=0;
	}
	for(int i=1;i<=n;++i) if(f[i]) putchar('@'+i);
	return 0;
}
2022/8/10 22:07
加载中...