记录编号 27890 评测结果 AAAAAAAAAA
题目名称 [NOIP 2005]等价表达式 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.045 s
提交时间 2011-10-09 22:07:00 内存使用 0.27 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

long long check=23,
		  result_t,
		  final;
long long num[50],//數字棧
		  op[50]; //運算符號棧

long long power(long long a,long long b)
{
	long long k=1;
	for(int i=0;i<b;i++)
		k*=a;
	return k;
}

//操作棧頂的兩個元素
void cul(int p,int op)
{
	if(op==0) num[p-1]=num[p-1]+num[p];
	if(op==1) num[p-1]=num[p-1]-num[p];
	if(op==2) num[p-1]=num[p-1]*num[p];
	if(op==5) num[p-1]=power( num[p-1],num[p] );
}

long long result(string str)
{
	int op_nxt,//下一個即將入棧操作符
		len=str.length(),
		p=-1,q=-1;  //數字棧、符號棧的指針
	long long num_nxt=0;//下一個即將入棧的數字
	for(int i=0;i<len;i++)
	{
		if(str[i]=='a')
		{
			num[++p]=check;
		}
		else if(str[i]>='0' && str[i]<='9')
		{
			num_nxt=num_nxt*10+(str[i]-'0');
		}
		else if(str[i]!=' ')
		{
			if( num_nxt!=0) 
			{
				num[++p]=num_nxt;
				num_nxt=0;
			}
			if(str[i]=='+') op_nxt=0;
			if(str[i]=='-') op_nxt=1;
			if(str[i]=='*') op_nxt=2;
			if(str[i]=='^') op_nxt= 5;
			if(str[i]=='(') op_nxt=6;
			if(str[i]==')') op_nxt=7;
			//如果有括號,則括號的優先級最高
			if(op_nxt==6)
			{
				op[++q]=op_nxt;
			}
			else if(op_nxt==7)
			{
				while(q>=0 && op[q--]!=6)
				{ //從上一個與該右括號匹配的左括號開始處理括號內的表達式
					cul(p--,op[q+1]);
				}
			}
			
			else 
			{	//從棧頂開始,把優先級高的運算符出棧
				while( q >= 0 && op[q] <= 5 && op[q]/2>=op_nxt/2)
				{
					cul(p--,op[q--]);
				}
				op[++q]=op_nxt;
			}
		}
	}
	//在最後清空堆棧
	if(num_nxt!=0)
	{
		num[++p]=num_nxt;
		num_nxt=0;
	}
	while(q>=0)
	{
		cul(p--,op[q--]);
	}
	return num[0];
}

int main() 
{
	freopen("equal.in","r",stdin);
	freopen("equal.out","w",stdout);
	string str1,str2;
	int n;
	final=0;
	getline(cin,str1);
	cin>>n;
	getline(cin,str2);//過濾換行符
	while(n--)
	{
		bool flag=true;
		getline(cin,str2);
		for (int i=10;i<=20;i++)
		{
			check=i;
			if (result(str1)!=result(str2))
			{
				flag=false;
				break;
			}
		}
		if (flag) cout<<(char)('A'+final);
		final++;
	}
	cout<<endl;
	return 0;
}