沂南网站建设,做局域网站数据库,怎样建设美丽中国?,屏蔽wordpress头像题目描述
对于1 位二进制变量定义两种运算#xff1a; 运算的优先级是#xff1a;
先计算括号内的#xff0c;再计算括号外的。
“ ”运算优先于“⊕”运算#xff0c;即计算表达式时#xff0c;先计算 运算#xff0c;再计算⊕运算。例如#xff1a;计算表达式A⊕B …题目描述
对于1 位二进制变量定义两种运算 运算的优先级是
先计算括号内的再计算括号外的。
“× ”运算优先于“⊕”运算即计算表达式时先计算× 运算再计算⊕运算。例如计算表达式A⊕B × C时先计算 B × C其结果再与 A 做⊕运算。现给定一个未完成的表达式例如(*_)请你在横线处填入数字0 或者1 请问有多少种填法可以使得表达式的值为0 。 输入输出格式 输入格式
输入文件名为exp.in 共 2 行。
第1 行为一个整数 L表示给定的表达式中除去横线外的运算符和括号的个数。
第2 行为一个字符串包含 L 个字符其中只包含’’、’’、’’、’’这4 种字符其中’’、’’是左右括号’’、’’分别表示前面定义的运算符“⊕”和“×”。这行字符按顺序给出了给定表达式中除去变量外的运算符和括号。
输出格式
输出文件exp.out 共1 行。包含一个整数即所有的方案数。注意这个数可能会很大请输出方案数对10007 取模后的结果。
输入输出样例 输入样例#1
4 (*)
输出样例#1 说明
【输入输出样例说明】
给定的表达式包括横线字符之后为(*_)
在横线位置填入(0 、0 、0) 、(0 、1 、0) 、(0 、0 、1) 时表达式的值均为0 所以共有3种填法。
【数据范围】
对于20% 的数据有 0 ≤ L ≤ 10。
对于50% 的数据有 0 ≤ L ≤ 1,000。
对于70% 的数据有 0 ≤ L ≤ 10,000 。
对于100%的数据有 0 ≤ L ≤ 100,000。
对于50% 的数据输入表达式中不含括号。 【分析代码】
很神奇的一道题...
先把应该填的空空模拟找出来然后塞进去任意一个数字比如1代表该位置要填数
然后就是栈模拟只不过数字栈存放两个变量答案为0时解的个数 和 答案为1时解的个数...
//洛谷 P1310 表达式的值
#includestack
#includecstdio
#includecstring
#includeiostream
#define mp make_pair
#define fo(i,j,k) for(ij;ik;i)
using namespace std;
const int mxn300005;
const int mod10007;
stack char mul;
stack pairint,int num; //答案为0/1的种类数
char s[mxn],ch;
inline void calc(bool flag) //flag1是乘法,flag0是除法 递推求得
{mul.pop();pair int,int n1num.top();num.pop();pair int,int n2num.top();num.pop();pair int,int ans;if(flag) ansmp(n1.first*n2.firstn1.first*n2.secondn1.second*n2.first,n1.second*n2.second);else ansmp(n1.first*n2.first,n1.first*n2.secondn1.second*n2.firstn1.second*n2.second);ans.first%mod,ans.second%mod; num.push(ans);
}
int main()
{int i,j,n,cnt0;scanf(%d,n);fo(i,1,n) //输入并插入要填数字的位置用1表示 {chgetchar();if(ch\n || ch\r || ch ) {i--;continue;}if((ch || ch*) s[cnt]!)) s[cnt]1;else if(ch) (s[cnt] || s[cnt]*)) s[cnt]1;s[cnt]ch;}if(s[cnt] || s[cnt]*) s[cnt]1;fo(i,1,cnt){if(s[i]1) {num.push(mp(1,1));continue;}if(mul.empty() || s[i]() {mul.push(s[i]);continue;}if(s[i])){while(mul.top()!(){char tmpmul.top();if(tmp*) calc(1);else if(tmp) calc(0);}mul.pop();continue;}if(s[i]){while(!mul.empty() mul.top()*)calc(1);mul.push();continue;}if(s[i]*) mul.push(*);}while(!mul.empty()){char tmpmul.top();if(tmp*) calc(1);else calc(0);}printf(%d\n,num.top().first);return 0;
}