哪有错求调
查看原帖
哪有错求调
737833
orson111楼主2023/8/5 16:27

样例通不过

#include<bits/stdc++.h>
using namespace std;
string s;
int rp(int x){
    if(s[x]!='(') return x;
    int cnt=0;
    for(int i=x;i<s.length();i++){
        if(s[x]=='(') cnt++;
        else if(s[x]==')') cnt--;
        if(!cnt) return i;
    }
    return x;
}
int lp(int x){
    if(s[x]!=')') return x;
    int cnt=0;
    for(int i=x;i>=0;i--){
        if(s[x]=='(') cnt++;
        else if(s[x]==')') cnt--;
        if(cnt==0) return i;
    }
    return x;
}
void init(){
    for(int i=0;i<s.length();i++){
        if(s[i]=='&'){
            int l=lp(i-1),r=rp(i+1);
            if((!l||s[l-1]!='(')||(r+1>=s.length()||s[r+1]!=')')){
                s.insert(l,"(");
                r++;
                s.insert(r+1,")");
                i++;
            }
        }
    }
    for(int i=0;i<s.length();i++){
        if(s[i]=='|'){
            int l=lp(i-1),r=rp(i+1);
            if((!l||s[l-1]!='(')||(r+1>=s.length()||s[r+1]!=')')){
                s.insert(l,"(");
                r++;
                s.insert(r+1,")");
                i++;
            }
        }
    }
}
int andc,orc;
int calc(int a,int b){
    if(b-a==1) return (a=='0'?0:1);
    if(rp(a+1)==b-2) return calc(a+1,b-1);
    int op=rp(a+1)+1;
    int end=rp(op+1);
    int first=calc(a+1,op);
    if(first==0&&s[op]=='&'){andc++;return 0;}
    if(first==1&&s[op]=='|'){orc++;return 1;}
    int second=calc(op+1,end+1);
    if(s[op]=='&') return first&second;
    else return first|second;
}
void solve(){
    init();
    cout<<calc(0,s.length())<<endl;
    cout<<andc<<" "<<orc<<endl;
}
int main(){
  	cin>>s;
  	solve();
  	return 0;
}
2023/8/5 16:27
加载中...