#P1417. True Liars

True Liars

题目描述

在乘坐小船漂流了几天后,前田明·克鲁索终于被冲上了一座雾气弥漫的岛屿。尽管他筋疲力尽、陷入绝望,但幸运的是,他想起了小时候从族长那里听到的关于雾岛的传说。这里一定就是传说中的那座岛。传说中,岛上居住着两个部落,一个是神圣的,另一个是邪恶的。一旦神圣部落的成员祝福你,你的未来就会光明而充满希望,灵魂终将升入天堂;相反,一旦邪恶部落的成员诅咒你,你的未来就会黯淡无望,灵魂终将坠入地狱。

为了避免最坏的情况发生,明必须区分邪恶部落和神圣部落。但如何区分呢?他们的外表一模一样,仅凭外貌无法分辨。不过,他还有最后的希望。神圣部落的成员是说真话的人,即他们总是说真话;而邪恶部落的成员是说谎者,即他们总是撒谎。

他询问了其中一些人关于其他人是否属于神圣部落的问题。他们彼此非常了解,并根据各自的特性(即总是说真话或总是撒谎)“忠实”地回答了他的问题。他不敢问其他形式的问题,因为传说中说,邪恶部落的成员如果不喜欢问题,就会永远诅咒提问者。他还有另一条有用的信息:传说中记载了两个部落的人口数量。这些数字是可信的,因为岛上的居民都是永生的,至少几千年来没有人出生过。

你是一名优秀的程序员,因此被请求编写一个程序,根据居民对明的问题的回答对他们进行分类。

输入
输入包含多个数据集,每个数据集的格式如下:

nn p1p1 p2p2
x1x_1 y1y_1 a1a_1
x2x_2 y2y_2 a2a_2
...
xix_i yiy_i aia_i
...
xnx_n yny_n ana_n

第一行包含三个非负整数 nnp1p1p2p2nn 是明提出的问题数量,p1p1p2p2 分别是传说中神圣部落和邪恶部落的人口数量。接下来的 nn 行中,每行包含两个整数 xix_iyiy_i 和一个单词 aia_ixix_iyiy_i 是居民的编号,范围在 11p1+p2p1 + p2 之间(包括 11p1+p2p1 + p2)。aia_i 是“yes”或“no”:“yes”表示居民 xix_i 说居民 yiy_i 属于神圣部落,“no”则表示相反。注意,xix_iyiy_i 可能相同,因为“你属于神圣部落吗?”是一个有效的问题。另外,由于明非常焦虑,可能会多次向同一个人提出相同的问题,因此可能存在两行的 xxyy 相同的情况。

你可以假设 nn 小于 10001000p1p1p2p2 小于 300300。一行三个 00(即 00 00 00)表示输入结束。每个数据集都是一致的,不包含矛盾的回答。

输出
对于每个数据集,如果包含足够的信息可以分类所有居民,则按升序输出所有神圣部落成员的编号,每行一个。最后另起一行输出“end”。否则,如果数据集提供的信息不足以确定所有神圣部落成员,则输出一行“no”。

输入数据 1

2 1 1  
1 2 no  
2 1 no  
3 2 1  
1 1 yes  
2 2 yes  
3 3 yes  
2 2 1  
1 2 yes  
2 3 no  
5 4 3  
1 2 yes  
1 3 no  
4 5 yes  
5 6 yes  
6 7 no  
0 0 0  

输出数据 1

no  
no  
1  
2  
end  
3  
4  
5  
6  
end  

来源
Japan 2002 Kanazawa