玄学MLE求助
查看原帖
玄学MLE求助
75765
Starlight237楼主2020/5/23 23:10

rt.

#include<bits/stdc++.h>
using namespace std;
#define reg register
inline void work();
int main(){
    work();
    return 0;
}
//End of MAIN
const int N=701,mod=1e9+7;
int n,match[N];
long long dp[N][N][3][3];
char str[N];
stack<int>S;
void dfs(int l,int r){
    if(l+1==r){dp[l][r][0][1]=dp[l][r][0][2]=dp[l][r][1][0]=dp[l][r][2][0]=1;return;}
    dfs(l+1,r-1);
    if(match[l]==r){
        for(reg int i=0;i<3;++i)
            for(reg int j=0;j<3;++j)
                j!=1&&(dp[l][r][0][1]=(dp[l][r][0][1]+dp[l+1][r-1][i][j])%mod),
                j!=2&&(dp[l][r][0][2]=(dp[l][r][0][2]+dp[l+1][r-1][i][j])%mod),
                i!=1&&(dp[l][r][1][0]=(dp[l][r][1][0]+dp[l+1][r-1][i][j])%mod),
                i!=2&&(dp[l][r][2][0]=(dp[l][r][2][0]+dp[l+1][r-1][i][j])%mod);
        return;
    }
    dfs(l,match[l]),dfs(match[l]+1,r);
    for(reg int i=0;i<3;++i)
            for(reg int j=0;j<3;++j)
                for(reg int p=0;p<3;++p)
                    for(reg int q=0;q<3;++q)
                        (j==1&&p==1)||(j==2&&p==2)||(
                            dp[l][r][i][q]=(dp[l][r][i][q]+dp[l][match[l]][i][j]*dp[match[l]+1][r][p][q])%mod
                        );
}
inline void work(){
    scanf("%s",str+1),n=strlen(str+1);
    for(reg int i=1;i<=n;++i)
        str[i]=='('?S.push(i):(match[S.top()]=i,match[i]=S.top(),S.pop());
    dfs(1,n);
    reg long long ans=0;
    for(reg int i=0;i<3;++i)
        for(reg int j=0;j<3;++j)
            ans=(ans+dp[1][n][i][j])%mod;
    printf("%lld",ans);
}
2020/5/23 23:10
加载中...