CF87B.Vasya and Types

普及/提高-

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

Programmer Vasya is studying a new programming language &K*. The &K* language resembles the languages of the C family in its syntax. However, it is more powerful, which is why the rules of the actual C-like languages are unapplicable to it. To fully understand the statement, please read the language's description below carefully and follow it and not the similar rules in real programming languages.

There is a very powerful system of pointers on &K* — you can add an asterisk to the right of the existing type XX — that will result in new type XX* . That is called pointer-definition operation. Also, there is the operation that does the opposite — to any type of XX , which is a pointer, you can add an ampersand — that will result in a type &X , to which refers XX . That is called a dereference operation.

The &K* language has only two basic data types — void and errtype. Also, the language has operators typedef and typeof.

  • The operator "typedef AA BB " defines a new data type BB , which is equivalent to AA . AA can have asterisks and ampersands, and BB cannot have them. For example, the operator typedef void** ptptvoid will create a new type ptptvoid, that can be used as void**.
  • The operator "typeof AA " returns type of AA , brought to void, that is, returns the type void**...*, equivalent to it with the necessary number of asterisks (the number can possibly be zero). That is, having defined the ptptvoid type, as shown above, the typeof ptptvoid operator will return void**.

An attempt of dereferencing of the void type will lead to an error: to a special data type errtype. For errtype the following equation holds true: errtype* == &errtype == errtype. An attempt to use the data type that hasn't been defined before that will also lead to the errtype.

Using typedef, we can define one type several times. Of all the definitions only the last one is valid. However, all the types that have been defined earlier using this type do not change.

Let us also note that the dereference operation has the lower priority that the pointer operation, in other words &T* is always equal to TT .

Note, that the operators are executed consecutively one by one. If we have two operators "typedef &void a" and "typedef a* b", then at first a becomes errtype, and after that b becomes errtype* = errtype, but not &void* = void (see sample 2).

Vasya does not yet fully understand this powerful technology, that's why he asked you to help him. Write a program that analyzes these operators.

输入格式

The first line contains an integer nn ( 1<=n<=1001<=n<=100 ) — the number of operators. Then follow nn lines with operators. Each operator is of one of two types: either "typedef AA BB ", or "typeof AA ". In the first case the BB type differs from void and errtype types, and besides, doesn't have any asterisks and ampersands.

All the data type names are non-empty lines of no more than 20 lowercase Latin letters. The number of asterisks and ampersands separately in one type in any operator does not exceed 10, however if we bring some types to void with several asterisks, their number may exceed 10.

输出格式

For every typeof operator print on the single line the answer to that operator — the type that the given operator returned.

输入输出样例

  • 输入#1

    5
    typedef void* ptv
    typeof ptv
    typedef &&ptv node
    typeof node
    typeof &ptv
    

    输出#1

    void*
    errtype
    void
    
  • 输入#2

    17
    typedef void* b
    typedef b* c
    typeof b
    typeof c
    typedef &b b
    typeof b
    typeof c
    typedef &&b* c
    typeof c
    typedef &b* c
    typeof c
    typedef &void b
    typeof b
    typedef b******* c
    typeof c
    typedef &&b* c
    typeof c
    

    输出#2

    void*
    void**
    void
    void**
    errtype
    void
    errtype
    errtype
    errtype
    

说明/提示

Let's look at the second sample.

After the first two queries typedef the b type is equivalent to void*, and с — to void**.

The next query typedef redefines b — it is now equal to &b = &void* = void. At that, the с type doesn't change.

After that the с type is defined as &&b* = &&void* = &void = errtype. It doesn't influence the b type, that's why the next typedef defines c as &void* = void.

Then the b type is again redefined as &void = errtype.

Please note that the c type in the next query is defined exactly as errtype******* = errtype, and not &void******* = void******. The same happens in the last typedef.

首页