#P16511. [NEERC2008 Northern]Important Wires
[NEERC2008 Northern]Important Wires
题目描述
Nick 买了一块新主板,但它似乎不能正常工作。主板结构十分复杂,不过其中只有少量“重要导线”。每根重要导线只有两种状态:
- 通电,表示逻辑真;
- 断电,表示逻辑假。
Nick 希望确定这些重要导线的状态,但无法直接接触它们。幸运的是,他发现了一个维修插座。插座的每个输出引脚都通过某个集成电路连接到若干条重要导线。
Nick 在网上找到了电路图,并采用如下命名方式:
- 用小写英文字母表示重要导线;
- 用大写英文字母表示维修插座的输出引脚。
对于每个输出引脚,电路图都给出一个布尔公式。公式中,通电表示真,断电表示假。
公式使用以下记号,运算优先级从高到低排列:
- 变量名:
a到k; - 括号:若 是公式,则 也是公式;
- 否定:;
- 合取:;
- 析取:;
- 蕴含:;
- 等价:$E_1\Leftrightarrow E_2\Leftrightarrow\cdots\Leftrightarrow E_n$。
蕴含运算按从右到左结合。例如:
表示
连续等价表达式按如下定义计算:
$$(E_1\Leftrightarrow E_2)\land(E_2\Leftrightarrow E_3)\land\cdots\land(E_{n-1}\Leftrightarrow E_n).$$Nick 手中有各种逻辑门,因此可以构造实现任意布尔公式的新电路。新电路的变量只能是维修插座的输出引脚。
他首先希望构造一个电路:它以所有维修插座引脚为输入,并且其唯一输出在所有重要导线状态下都恒为真。
请判断这样的电路是否存在。如果存在,还需要构造一个满足要求的公式。
输入格式
第一行包含一个整数 ,表示维修插座的引脚数量。
接下来 行,每行描述一个引脚,格式为:
引脚名 := 布尔公式
其中:
- 引脚名是一个大写英文字母;
- 公式由以下记号组成:
a到k;(、);~,表示否定;&,表示合取;|,表示析取;=>,表示蕴含;<=>,表示等价;
- 任意两个记号之间可以有任意数量的空格;
- 每行描述的长度不超过 个字符。
输出格式
如果不存在满足要求的电路,输出:
No
否则:
- 第一行输出:
Yes
- 第二行输出一个构造出的布尔公式。
输出公式必须满足:
- 只能包含维修插座的引脚名,不能包含重要导线名;
- 输入中出现的每个引脚名都必须在公式中至少出现一次;
- 公式格式与输入中的公式格式相同;
- 公式所在行长度不得超过 个字符;
- 对任意重要导线状态,该公式的值都必须为真。
样例
输入
3
A := (a=>c )& (b<=>d)
C:= a | b
B := c | d
输出
Yes
C&A => B | ~A
数据范围
- ;
- 重要导线名只可能为
a到k; - 每条引脚描述不超过 个字符。