We 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 |
---|---|---|
, the correctness can be determined by considering only condition . | ||
, the correctness can be determined by considering only condition and . | ||
. | ||
. |
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
circle
has already been defined in the third row. - The sixth declaration is incorrect because class
object
hasn't been defined yet. - The eighth declaration is correct because class
object
has now been declared, and the sixth declaration was discarded, so classrunnable
hasn'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