class YesNode:
    pass

class NoNode:
    pass

class AndNode:
    def __init__(self, left, right):
        self.left = left
        self.right = right

class OrNode:
    def __init__(self, left, right):
        self.left = left
        self.right = right

class RandomNode:
    def __init__(self, x, y):
        self.x = x
        self.y = y

def tokenize(s):
    tokens = []
    n = len(s)
    pos = 0
    while pos < n:
        if pos + 6 <= n and s[pos:pos+6] == 'random':
            tokens.append('random')
            pos += 6
            continue
        if pos + 3 <= n and s[pos:pos+3] == 'YES':
            tokens.append('YES')
            pos += 3
            continue
        if pos + 3 <= n and s[pos:pos+3] == 'and':
            tokens.append('and')
            pos += 3
            continue
        if pos + 2 <= n and s[pos:pos+2] == 'NO':
            tokens.append('NO')
            pos += 2
            continue
        if pos + 2 <= n and s[pos:pos+2] == 'or':
            tokens.append('or')
            pos += 2
            continue
        if s[pos] == '(' or s[pos] == ')':
            tokens.append(s[pos])
            pos += 1
            continue
        raise ValueError(f"Invalid token at position {pos} in string {s}")
    return tokens

class Parser:
    def __init__(self, tokens):
        self.tokens = tokens
        self.pos = 0
    
    def parse(self):
        return self.parse_expr()
    
    def parse_expr(self):
        return self.parse_or_expr()
    
    def parse_or_expr(self):
        node = self.parse_and_expr()
        while self.has_next() and self.current_token() == 'or':
            self.consume()
            right = self.parse_and_expr()
            node = OrNode(node, right)
        return node
    
    def parse_and_expr(self):
        node = self.parse_primary()
        while self.has_next() and self.current_token() == 'and':
            self.consume()
            right = self.parse_primary()
            node = AndNode(node, right)
        return node
    
    def parse_primary(self):
        token = self.current_token()
        if token == 'YES':
            self.consume()
            return YesNode()
        elif token == 'NO':
            self.consume()
            return NoNode()
        elif token == 'random':
            self.consume()
            self.consume('(')
            x = self.parse_expr()
            y = self.parse_expr()
            self.consume(')')
            return RandomNode(x, y)
        elif token == '(':
            self.consume()
            expr = self.parse_expr()
            self.consume(')')
            return expr
        else:
            raise SyntaxError(f"Unexpected token {token} at position {self.pos}")
    
    def has_next(self):
        return self.pos < len(self.tokens)
    
    def current_token(self):
        if self.pos >= len(self.tokens):
            return None
        return self.tokens[self.pos]
    
    def consume(self, expected=None):
        if expected is not None:
            if not self.has_next() or self.tokens[self.pos] != expected:
                raise SyntaxError(f"Expected {expected}, got {self.tokens[self.pos] if self.has_next() else 'EOF'}")
        self.pos += 1

def main():
    import sys
    input = sys.stdin.read().splitlines()
    N = int(input[0])
    P, Q, R = map(float, input[1].split())
    S = input[2].strip()
    
    tokens = tokenize(S)
    parser = Parser(tokens)
    root = parser.parse()
    
    memo = {}
    stack = [ (root, False) ]
    
    while stack:
        node, is_processed = stack.pop()
        if node in memo:
            continue
        if isinstance(node, YesNode):
            memo[node] = 1.0
            continue
        if isinstance(node, NoNode):
            memo[node] = 0.0
            continue
        if not is_processed:
            stack.append( (node, True) )
            if isinstance(node, (AndNode, OrNode)):
                stack.append( (node.right, False) )
                stack.append( (node.left, False) )
            elif isinstance(node, RandomNode):
                stack.append( (node.y, False) )
                stack.append( (node.x, False) )
        else:
            if isinstance(node, AndNode):
                left = memo[node.left]
                right = memo[node.right]
                original = left * right
                res = original * (1 - R) + (1 - original) * R
                memo[node] = res
            elif isinstance(node, OrNode):
                left = memo[node.left]
                right = memo[node.right]
                original = 1 - (1 - left) * (1 - right)
                res = original * (1 - R) + (1 - original) * R
                memo[node] = res
            elif isinstance(node, RandomNode):
                x_p = memo[node.x]
                y_p = memo[node.y]
                prob_both = x_p * y_p
                res = prob_both * P + (1 - prob_both) * Q
                memo[node] = res
            else:
                raise TypeError(f"Unexpected node type {type(node)}")
    
    result = memo[root] * 100
    print(int(result // 1))

if __name__ == '__main__':
    main()