求助:此代码为什么RE
  • 板块学术版
  • 楼主fe117
  • 当前回复14
  • 已保存回复14
  • 发布时间2024/1/26 20:57
  • 上次更新2024/1/27 07:26:42
查看原帖
求助:此代码为什么RE
1025217
fe117楼主2024/1/26 20:57
#include <iostream>
#include <cmath>
#define int short
using namespace std;
string s;
long long andsum,orsum,ll,rr;
int find(char ch,int l,int r){//寻找最后一个不在括号内的字符(&和|)
	int res=0;
	for(long long i=r;i>=l;i--){
		if(s[i]==')')res++;
		if(s[i]=='(')res--;
		if(s[i]==ch&&res==0)return i;
	}
	return -1;
}
int dfs(long long l,long long r){
	//cout<<"dfsed "<<l<<" "<<r<<endl;
	if(s[l]=='('&&s[r]==')'){//去除括号
		if(l==ll)ll++;
		if(r==rr)rr--;
		int ret=dfs(l+1,r-1);
		return ret;
	}
	if(l==r)return s[l]-'0';//单个数字的特判
	long long fff;
	char wf;
	fff=find('|',l,r);//寻找最后一个“|”
	wf='|';
	if(fff==-1){
		fff=find('&',l,r);//找不到“|”时找“&”
		wf='&';
	}
	if(fff==-1)return 1/0;//这是找不到|找不到&的情况,才会RE++++++++++++++++++++++++++++++++++++++++
	int dfl,dfr;
	dfl=dfs(max(l,ll),fff-1);
	
	//if(l==1&&r==3)cout<<"sd"<<dfl<<"  "<<dfr<<"gf";
	//if(l==1&&r==3)cout<<wf<<"kzisgviys";
	if(wf=='|'){//当找到|
		if(dfl==1){//短路
			orsum++;
			return 1;
		}
		else{
			dfr=dfs(fff+1,min(r,rr));
		}
		return dfl|dfr;
	}
	if(wf=='&'){//当找到&
		if(dfl==0){//短路
			andsum++;
			return 0;
		}
		else{
			dfr=dfs(fff+1,min(r,rr));
		}
		return dfl&dfr;
	}
}
signed main(){
	cin>>s;
	rr=s.length()-1;
	cout<<dfs(0,s.length()-1)<<endl<<andsum<<" "<<orsum;
	return 0;
}

(RE是我在33行加的,为了方便寻找注释了一些加好) 题目:P8815

2024/1/26 20:57
加载中...