COI '15 #1 Dijamant
View as PDFWe are observing class declarations in an object-oriented programming language similar to C++. Each class declaration is of the form K : P1 P2 ... Pk ; where  is the name of the new class being declared, and 
 the names of classes being inherited by class 
. For example, 
shape : ; is a declaration of class shape that does not inherit any other class, whereas square : shape rectangle ; is a declaration of class square that inherits classes shape and rectangle.
If class  inherits class 
, class 
 inherits class 
, and so on, up to class 
 that inherits class 
, then we say that all classes 
 are derived from class 
. The rules of the programming language forbid circular definitions, so it is not allowed to have a class derived from itself. In other words, the class hierarchy forms a directed acyclic graph. Additionally, it is not allowed for a so-called diamond to appear in the class hierarchy. A diamond consists of four different classes 
 such that it holds:
- Classes 
and
are derived from
.
 - Class 
is derived from both
and
.
 - Neither is class 
derived from
, nor is class
derived from
.
 
You are given a series of class declarations to be processed sequentially, and determine for each one whether it is correctly declared. The correctly declared classes are added to the hierarchy, while the incorrect ones are discarded. Declaration K : P1 P2 ... Pk ; is correctly declared if the following holds:
- Class 
hasn't been declared yet.
 - All classes 
have been previously declared. Notice that this condition ensures that a class can never be derived from itself, or that cycles cannot exist in the class hierarchy.
 - By adding class 
that inherits
the class hierarchy remains in order, that is, not a single diamond is formed.
 
Write a programme that will process the declarations respectively as described above and determine the correctness of each one of them.
Input Specification
The first line of input contains the integer  – the number of declarations. Each of the following 
 lines contains a single declaration in the form of 
K : P1 P2 ... Pk ; where  is a series of zero, one or more classes that class 
 inherits. All class names in a single declaration 
 are mutually different. Each class name is a string of at most 
 lower case letters of the English alphabet. All the elements of a declaration (the class names and characters 
: and ;) are separated by exactly one space. In each specific declaration, for the number of classes  it holds 
.
Output Specification
You must output  lines. The 
 line must contain 
ok if the  declaration is correct, and 
greska if it isn't.
Constraints
| Subtask | Score | Constraints | 
|---|---|---|
Sample Input 1
10
shape : ;
rectangle : shape ;
circle : shape ;
circle : ;
square : shape rectangle ;
runnable : object ;
object : ;
runnable : object shape ;
thread : runnable ;
applet : square thread ;
Sample Output 1
ok
ok
ok
greska
ok
greska
ok
ok
ok
greska
Explanation for Sample Output 1
- The fourth declaration is incorrect because class 
circlehas already been defined in the third row. - The sixth declaration is incorrect because class 
objecthasn't been defined yet. - The eighth declaration is correct because class 
objecthas now been declared, and the sixth declaration was discarded, so classrunnablehasn't been defined yet. - The tenth declaration is incorrect because otherwise the following diamond forms: 
shape,applet,square,runnable. 
Sample Input 2
9
a : ;
x : ;
b : a x ;
c : b ;
d : a b c ;
e : d a ;
f : c e ;
y : x ;
g : c y e ;
Sample Output 2
ok
ok
ok
ok
ok
ok
ok
ok
greska
Explanation for Sample Output 2
- The tenth declaration is incorrect because otherwise the following diamond forms: 
x,g,y,d(and many others). 
Comments