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 |
---|---|---|
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