等价表达式

栈的经典题目,开两个栈,一个存符号,一个存数字;

分情况讨论:

1.如果当前读到的运算符优先级小于栈顶,就进行一次运算,直到大于等于;

2.如果读到数字用类似读入优化的方法读入进来;

3.如果当前符号为“(”则直接入栈;

4.如果当前符号为“)”则进行运算直到碰到“(”;

5.小技巧 在式子开头加“(”,末尾加“)”;

6.遇到a,让a等于质数;

7.多次取模,因为有可能爆long long,模不同的质数,避免冲突

最后,然而我并没A掉,在codevs上测的60分,WA了4个点;

洛谷上全TLE........ 也许洛谷跟STL有仇吧,不管我事了。

//等价表达式
#include<bits/stdc++.h>
#define MOD 99824435
#define M 991
using namespace std;
char a[51];
stack<int>sign;
stack<int>num;
int n;
int len;
long long ans;

void read()
{
char c=getchar();
int ll=0,rr=0;
while(c==‘\n‘)c=getchar();
while(c!=‘\n‘)
{
if(c!=‘ ‘)
a[++len]=c;
c=getchar();
}
a[0]=‘(‘;
a[++len]=‘)‘;
}

int POW(int x,int t)
{
if(t==0)
return 1;
if(t==1||x==0||x==1)
return x;
while(t%2==0)
{
x=(x*x)%MOD;
t>>=1;
}
int result=1;
while(t>0)
{
if(t%2==1)
{
result*=x;
t--;
result%=MOD;
}
else
{
x*=x;
x%=MOD;
t>>=1;
}
}
return result;
}

void work(int x)
{
while(sign.top()>=x)
{
if(sign.top()==2)
{
int t=num.top();
num.pop();
t=-t;
sign.pop();
t+=num.top();
num.pop();
num.push(t);
}
else
if(sign.top()==1)
{

int t=num.top();
num.pop();
sign.pop();
t+=num.top();
num.pop();
num.push(t);
}
else
if(sign.top()==4)
{
int t=num.top();
num.pop();
sign.pop();
t*=num.top();
num.pop();
num.push(t);
}
else
if(sign.top()==5)
{
int t=num.top();
num.pop();
sign.pop();
t=POW(num.top(),t)%MOD;
num.pop();
num.push(t);
}
}
sign.push(x);
}

long long deal()
{
int l=0;
while(l<=len)
{
if(a[l]==‘+‘)
{
work(1);
l++;
}
else
if(a[l]==‘-‘)
{
work(2);
l++;
}
else
if(a[l]==‘*‘)
{
work(4);
l++;
}
else
if(a[l]==‘^‘)
{
work(5);
l++;
}
else
if(a[l]==‘(‘)
{
sign.push(-1);
l++;
}
else
if(a[l]==‘)‘)
{
l++;
while(sign.top()!=-1)
{
if(sign.top()==2)
{
int t=num.top();
num.pop();
t=-t;
sign.pop();
t+=num.top();
num.pop();
num.push(t);
}
else
if(sign.top()==1)
{
int t=num.top();
num.pop();
sign.pop();
t+=num.top();
num.pop();
num.push(t);
}
else
if(sign.top()==4)
{
int t=num.top();
num.pop();
sign.pop();
t*=num.top();
num.pop();
num.push(t);
}
else
if(sign.top()==5)
{
int t=num.top();
num.pop();
sign.pop();
t=POW(num.top(),t)%MOD;
num.pop();
num.push(t);
}
}
sign.pop();
}
else
if(a[l]==‘a‘)
{
num.push(1609);
l++;
}
else
{
int t=0;
while(a[l]>=‘0‘&&a[l]<=‘9‘)
{
t=t*10+a[l]-‘0‘;
l++;
}
num.push(t);
}
}
return num.top()%MOD;
}

int cc[100];
int cnt;

int ANS;

int main()
{
read();
ans=deal();
ans%=MOD;
ANS=ans;
ANS%=M;
cin>>n;
int t=1;
while(t<=n)
{
len=0;
read();
int tt=deal();
int TT=tt;
tt%=MOD;
TT%=M;
if(ans==tt&&ANS==TT)
{
cc[++cnt]=64+t;
}
t++;
}
for(int i=1;i<=cnt;i++)
{
cout<<(char)cc[i];
}
return 0;
}

时间: 2024-09-30 03:56:40

等价表达式的相关文章

数据结构--栈 codevs 1107 等价表达式

codevs 1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的. 这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这

1107 等价表达式

1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的. 这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来

和指针相关的两个特殊运算符,和相关的等价表达式

和指针相关的两个特殊运算符: 一."&" 取地址运算符,通过&运算符可以取出普通变量的地址: 二."*"  有两种意义: 1.  为指针标志: 是否为指针标志主要看前面是否有类型,此处有一个int 2.  为指针运算符:    在等号右面为取值.*可以取出指针变量所指向的普通变量的值.   在等号左面为赋值.*可以将指针变量所指向的普通变量的值,修改为其他. 3.  为乘法运算符.当且仅当左右的都为变量时.略. 如 int a, b =20, c=3

NOIP2005 等价表达式 解题报告

明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的. 这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题.假设你是明明,能完成这个任务吗? 这个选择题中的每个表达式都满足下面的性质: 1.  表达式只可能包含一个变量‘a’. 2.  表达式中出现的数都是正整数,而且都小于10000. 3.

等价表达式(noip2005)

3.等价表达式 [问题描述]    兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的.    这个题目手算很麻烦,因为数学课代表对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题.假设你是数学课代表,能完成这个任务吗? 这个选择题中的每个表达式都满足下面的性质: 1. 表达式只可能包含一个变量

等价表达式(codevs 1107 答案错误)

题目描述 Description 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的. 这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题.假设你是明明,能完成这个任务吗? 这个选择题中的每个表达式都满足下面的性质:1.表达式只可能包含一个变量‘a’.2.表达式中出现的数都是正整数,而且都

NOIP2005 等价表达式

做题记录: 2016-08-10 23:35:09 背景 NOIP2005 提高组 第四道 描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的. 这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题.假设你是明明,能完成这个任务吗? 这个选择题中的每个表达式都满足下面的性质: 1.  

[Codevs 1107][NOIP 1107]等价表达式

题目连接:http://codevs.cn/problem/1107/ 一道很神奇的题目.对于算术表达式一类的问题,可以采用编译原理里的后缀表达式的方式来做,具体做法是分别维护两个栈,一个栈里保存表达式里的数字,另一个栈里保存表达式里的运算符,给每种运算符一个优先级,我们要维护这个栈的单调性,每次读入运算符中的数字或运算符,读入的是运算符时,若这个运算符比栈顶的运算符优先级低,就弹出栈顶元素,把栈顶的运算符和数字栈里栈顶的两个数字拿出来做一次运算,运算结果再入数字栈,直到运算符栈的栈顶元素优先级

等价表达式 (codevs 1107)题解

[问题描述] 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的. 这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题.假设你是明明,能完成这个任务吗? 这个选择题中的每个表达式都满足下面的性质:1.表达式只可能包含一个变量‘a’.2.表达式中出现的数都是正整数,而且都小于10000.3.