首页 > 试题广场 >

表达式得到期望结果的组合种数

[编程题]表达式得到期望结果的组合种数
  • 热度指数:3087 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个只由0(假)、1(真)、&(逻辑与)、|(逻辑或)和^(异或)五种字符组成的字符串express,再给定一个布尔值desired。求出express能有多少种组合方式,可以达到desired的结果。并输出你所求出的总方案数对取模后的值。

输入描述:
输出两行,第一行包含一个只有0、1、&、|和^组成的字符串。其长度小于500,第二行只有一个布尔值,代表desired。


输出描述:
输出一个整数,表示取模后的答案。
示例1

输入

1^0|0|1
false

输出

2

说明

1^((0|0)|1)和1^(0|(0|1))可以得到false
示例2

输入

1
false

输出

0

备注:
时间复杂度,空间复杂度
怎么取模都不行,摆烂了,直接unsigned long long😂
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdbool.h>

#define MOD 1000000007
typedef unsigned long long ull;

bool isValid(char *exp, int len) {
    if (len % 2 == 0) {
        return false;
    }
    for (int i = 0; i < len; i += 2) {
        if (exp[i] != '0' && exp[i] != '1') {
            return false;
        }
    }
    for (int i = 1; i < len; i += 2) {
        if (exp[i] != '&' && exp[i] != '|' && exp[i] != '^') {
            return false;
        }
    }
    return true;
}

int main(void) {
    char exp[501], desStr[6];
    int len;
    bool des;
    scanf("%s%s", exp, desStr);
    len = strlen(exp);
    des = strcmp(desStr, "true") == 0;
    if (!isValid(exp, len)) {
        printf("0\n");
        return 0;
    }

    ull **t, **f;
    t = (ull **) malloc(sizeof(ull *) * len);
    f = (ull **) malloc(sizeof(ull *) * len);
    for (int i = 0; i < len; i++) {
        t[i] = (ull *) calloc(len, sizeof(ull));
        f[i] = (ull *) calloc(len, sizeof(ull));
    }
    t[0][0] = exp[0] == '1' ? 1 : 0;
    f[0][0] = exp[0] == '0' ? 1 : 0;
    for (int i = 2; i < len; i += 2) {
        t[i][i] = exp[i] == '1' ? 1 : 0;
        f[i][i] = exp[i] == '0' ? 1 : 0;
        for (int j = i - 2; j >= 0; j -= 2) {
            for (int k = j; k < i; k += 2) {
                if (exp[k + 1] == '&') {
                    t[j][i] = (t[j][i] + (t[j][k] * t[k + 2][i]) % MOD) % MOD;
                    f[j][i] = (f[j][i] + (t[j][k] * f[k + 2][i]) % MOD) % MOD;
                    f[j][i] = (f[j][i] + (f[j][k] * t[k + 2][i]) % MOD) % MOD;
                    f[j][i] = (f[j][i] + (f[j][k] * f[k + 2][i]) % MOD) % MOD;
                } else if (exp[k + 1] == '|') {
                    t[j][i] = (t[j][i] + (t[j][k] * f[k + 2][i]) % MOD) % MOD;
                    t[j][i] = (t[j][i] + (f[j][k] * t[k + 2][i]) % MOD) % MOD;
                    t[j][i] = (t[j][i] + (t[j][k] * t[k + 2][i]) % MOD) % MOD;
                    f[j][i] = (f[j][i] + (f[j][k] * f[k + 2][i]) % MOD) % MOD;
                } else {
                    t[j][i] = (t[j][i] + (t[j][k] * f[k + 2][i]) % MOD) % MOD;
                    t[j][i] = (t[j][i] + (f[j][k] * t[k + 2][i]) % MOD) % MOD;
                    f[j][i] = (f[j][i] + (t[j][k] * t[k + 2][i]) % MOD) % MOD;
                    f[j][i] = (f[j][i] + (f[j][k] * f[k + 2][i]) % MOD) % MOD;
                }
            }
        }
    }

    printf("%llu\n", des ? t[0][len - 1] : f[0][len - 1]);
    return 0;
}


发表于 2022-01-29 14:11:36 回复(0)