#P16511. [NEERC2008 Northern]Important Wires

[NEERC2008 Northern]Important Wires

题目描述

Nick 买了一块新主板,但它似乎不能正常工作。主板结构十分复杂,不过其中只有少量“重要导线”。每根重要导线只有两种状态:

  • 通电,表示逻辑真;
  • 断电,表示逻辑假。

Nick 希望确定这些重要导线的状态,但无法直接接触它们。幸运的是,他发现了一个维修插座。插座的每个输出引脚都通过某个集成电路连接到若干条重要导线。

Nick 在网上找到了电路图,并采用如下命名方式:

  • 用小写英文字母表示重要导线;
  • 用大写英文字母表示维修插座的输出引脚。

对于每个输出引脚,电路图都给出一个布尔公式。公式中,通电表示真,断电表示假。

公式使用以下记号,运算优先级从高到低排列:

  1. 变量名:ak
  2. 括号:若 EE 是公式,则 (E)(E) 也是公式;
  3. 否定:¬E\lnot E
  4. 合取:E1E2EnE_1\land E_2\land\cdots\land E_n
  5. 析取:E1E2EnE_1\lor E_2\lor\cdots\lor E_n
  6. 蕴含:E1E2EnE_1\Rightarrow E_2\Rightarrow\cdots\Rightarrow E_n
  7. 等价:$E_1\Leftrightarrow E_2\Leftrightarrow\cdots\Leftrightarrow E_n$。

蕴含运算按从右到左结合。例如:

E1E2E3E_1\Rightarrow E_2\Rightarrow E_3

表示

E1(E2E3).E_1\Rightarrow(E_2\Rightarrow E_3).

连续等价表达式按如下定义计算:

$$(E_1\Leftrightarrow E_2)\land(E_2\Leftrightarrow E_3)\land\cdots\land(E_{n-1}\Leftrightarrow E_n).$$

Nick 手中有各种逻辑门,因此可以构造实现任意布尔公式的新电路。新电路的变量只能是维修插座的输出引脚。

他首先希望构造一个电路:它以所有维修插座引脚为输入,并且其唯一输出在所有重要导线状态下都恒为真。

请判断这样的电路是否存在。如果存在,还需要构造一个满足要求的公式。

输入格式

第一行包含一个整数 nn,表示维修插座的引脚数量。

接下来 nn 行,每行描述一个引脚,格式为:

引脚名 := 布尔公式

其中:

  • 引脚名是一个大写英文字母;
  • 公式由以下记号组成:
    • ak
    • ()
    • ~,表示否定;
    • &,表示合取;
    • |,表示析取;
    • =>,表示蕴含;
    • <=>,表示等价;
  • 任意两个记号之间可以有任意数量的空格;
  • 每行描述的长度不超过 10001000 个字符。

输出格式

如果不存在满足要求的电路,输出:

No

否则:

  • 第一行输出:
Yes
  • 第二行输出一个构造出的布尔公式。

输出公式必须满足:

  • 只能包含维修插座的引脚名,不能包含重要导线名;
  • 输入中出现的每个引脚名都必须在公式中至少出现一次;
  • 公式格式与输入中的公式格式相同;
  • 公式所在行长度不得超过 10001000 个字符;
  • 对任意重要导线状态,该公式的值都必须为真。

样例

输入

3
A := (a=>c )& (b<=>d)
C:= a | b
B := c | d

输出

Yes
C&A => B | ~A

数据范围

  • 1n101\le n\le 10
  • 重要导线名只可能为 ak
  • 每条引脚描述不超过 10001000 个字符。