玄关球对比代码
查看原帖
玄关球对比代码
766675
da_ke楼主2024/7/19 22:40

帮忙 check 一下两份代码有什么不同,测评结果可自行提交。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int N=1e5+24;
const int mod=10007;
int n;
string s;
int c1[N],c2[N],l1[N],l2[N];

inline pair<int,int> dfs(int l,int r)
{
    if(l>r) return {1,1};
    if(l1[r]>=l) // it is or
    {
        int pos=l1[r];
        pair<int,int> ansl=dfs(l,pos-1),ansr=dfs(pos+1,r);
        int ans1=ansl.first,ans2=ansl.second;
        int ans3=ansr.first,ans4=ansr.second;
        int ansf=ans1*ans3,anst=ans1*ans4+ans2*ans3+ans2*ans4;
        return make_pair(ansf%mod,anst%mod);
    }
    if(l2[r]>=l)
    {
        int pos=l2[r];
        pair<int,int> ansl=dfs(l,pos-1),ansr=dfs(pos+1,r);
        int ans1=ansl.first,ans2=ansl.second;
        int ans3=ansr.first,ans4=ansr.second;
        int anst=ans1*ans3,ansf=ans1*ans4+ans2*ans3+ans2*ans4;
        return make_pair(ansf%mod,anst%mod);
    }
    else return dfs(l+1,r-1);
}

int main()
{
    cin>>n>>s;
    s=' '+s;
    int lev=0;
    for(int i=1;i<=n;++i)
    {
        if(s[i]=='(') lev++;
        if(s[i]==')') lev--;
        if(s[i]=='+') c1[lev]=i;
        if(s[i]=='*') c2[lev]=i;
        l1[i]=c1[lev],l2[i]=c2[lev];
    }
    cout<<dfs(1,n).first;
}
#include <bits/stdc++.h>

using namespace std;

const int N=1e5+24;
const int mod=10007;

int L;
char str[N];
int c1[N],c2[N],l1[N],l2[N];

inline pair<int,int> dfs(int l,int r)
{
    pair<int,int> ans;
    if(l>r)
    {
        ans.first=1; //0
        ans.second=1; //1
        return ans;
    }
    if(l1[r]>=l) //or
    {
        pair<int,int> ansl=dfs(l,l1[r]-1);
        pair<int,int> ansr=dfs(l1[r]+1,r);
        
        ans.first=(ansl.first*ansr.first);ans.first%=mod;
        ans.second=(ansl.first*ansr.second+ansl.second*ansr.first+ansl.second*ansr.second);ans.second%=mod;
        return ans;
    }
    if(l2[r]>=l) //and
    {
        pair<int,int> ansl=dfs(l,l2[r]-1);
        pair<int,int> ansr=dfs(l2[r]+1,r);
        
        ans.second=(ansl.second*ansr.second);ans.second%=mod;
        ans.first=(ansl.first*ansr.second+ansl.second*ansr.first+ansl.first*ansr.first);ans.first%=mod;
        return ans;
    }
    else 
        return dfs(l+1,r-1);
}

int main()
{
    cin>>L;
    scanf("%s",str+1);
    int x=0;
    for(int i=1;i<=L;++i)
    {
        if(str[i]=='(')
            x+=1;
        else if(str[i]==')')
            x-=1;
        else if(str[i]=='+')
            c1[x]=i;
        else if(str[i]=='*')
            c2[x]=i;
        l1[i]=c1[x];
        l2[i]=c2[x];
    }
    cout<<dfs(1,L).first;
}
2024/7/19 22:40
加载中...