我们是在基于面向对象的编程语言类似于C++研究对类的声明。每个类声明的形式是“K : P1 P2 . . . Pk ” K是声明的新类的名称,P1, P2, . . . , Pk 类是L类K继承的类的名称。例如,“形状:”是一个声明的类“形状”,不继承任何其他类,而“正方形:形状矩形”是一个声明的类“正方形”继承类“形状”和“矩形”。
如果类K1继承类K2,类K2继承类K3,以此类推到类Km-1继承Km,那么我们可以说类K1,K2, . . . ,Km−1来自于Km。编程语言的规则禁止循环定义,因此不允许有从其自身派生的类。换句话说,类层次结构构成了有向无环图。此外,不允许在类层次中出现所谓的菱形。菱形由四个不同的类A,B,X,Y构成,比如:
• 类X和类Y来自于类A
•类B同时来自于类X和类Y
•X类不来自Y,Y类也不来自X
图一:一个菱形 图二:从第一个示例测试处理所有声明之后的层次结构
你以顺序处理一系列的类声明,并判断是否正确声明了每个类。将正确声明的类添加到层次结构中,而不正确的类将被丢弃。声明“k:P1 P2。..Pk;“如果满足下面条件就是正确声明:
1.K类尚未被声明。
2.所有类别P1,P2,…,Pk已被声明。请注意,此条件确保类不能从其自身派生,类层次中不存在循环。
3.通过添加继承P1、P2,..,Pk的阶级层次的类k保持秩序,也就是说,没有一个单一的菱形形成。
编写一个程序,将分别处理如上所述声明,并判断它们的正确性。
输入:
第一行整数n——声明的数目
接下来n行每行包括一个单一的声明形式“K : P1 P2 . . . Pk ;” P1 P2 . . . Pk是一系列的0,类K继承一个或者更多的类。单个声明中的所有类名,P1,P2,...,Pk是相互不同的。每个类名都是英文字母表上最多10个小写字母的字符串。声明的所有元素(类名和字符“:”和“;”)被一个空格隔开。在每一个具体的声明,类K的数量满足0≤k≤1000.
输出:
必须输出n行。如果第i个声明是正确的第i行必须显示“correct”,否则显示“greska”。
Scoring
样例:
Input 10 shape : ; rectangle : shape ; circle : shape ; circle : ; square : shape rectangle ; runnable : object ; object : ; runnable : object shape ; thread : runnable ; applet : square thread ; output ok ok ok greska ok greska ok ok ok greska input 9a : ; x : ; b : a x ; c : b ; d : a b c ; e : d a ; f : c e ; y : x ; g : c y e ; output ok ok ok ok ok ok ok ok greska第一个例子的说明:
•第四声明是不正确的,因为类“circle”已经定义在第三行。
•第六声明不正确,因为类“object”尚未定义
•第八个声明是正确的因为类“object”已经定义,第六个声明已经被丢弃,因此类“runnable”没有定义。
•第十个声明是错误的因为否则以下成菱形形状:“shape”, “applet”,“square”, “runnable”
第二个样例的说明:
•第十声明是不正确的,因为否则以下成菱形形式:“X”,“G”,“Y”,“d”(和许多其他)。