CodeForces - 87B - Vasya and Types

题目链接:http://codeforces.com/problemset/problem/87/B

题意: &K*是一种编程语言,有两种数据类型void、errtype;两种运算符*、&;

有两种语句:

一.typedef A B意思是定义字符串A为一种新类型且命名为B,A是"&..&type*...*"的形式,前面一个&可以和后面一个*相抵消

①.如果抵消后剩余字符串为...&str的形式,B类型为“errtype”

②.如果抵消后剩余字符串为str(*...)的形式,如果str为“errtype”或者str之前没有定义过,B类型为“errtype”;否则B类型为"str的类型+(*...)";

二.typeof A意思是查询A的类型内容,A是"&..&type*...*"的形式,前面一个&可以和后面一个*相抵消

①.如果抵消后剩余字符串为...&str的形式,输出“errtype”

②.如果抵消后剩余字符串为str(*...)的形式,如果str为“errtype”或者str之前没有定义过,输出为“errtype”;否则输出"str的类型+(*...)";

解析:这里不要正常去模拟,对于某类型,只需统计***的个数,对于&的个数,用*的个数减之,最后对于某类型如果*的个数小于等于0,直接输出errtype;如果个数大于0,输出void+*...

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=500010;
int n,ans,tmp,cnt;
int a[maxn],c[maxn];
char s[maxn],ss[maxn],sss[maxn];
map<string,int>mp;
string str1,str2;
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        mp.clear();
        mp["void"]=1;
        for(int i=0;i<n;i++)
        {
            scanf("%s",s);
            if(strcmp(s,"typedef")==0)
            {
                scanf("%s %s",ss,sss);
                int l=strlen(ss);
                int ans=0,cnt=0;
                str1="";
                for(int i=0;i<l;i++)
                {
                    if(ss[i]=='&') ans--;
                    else if(ss[i]=='*') ans++;
                    else str1+=ss[i];
                }
                cnt=mp[str1];
                if(cnt>0) cnt+=ans;
                else cnt=0;
                mp[(string)sss]=cnt;
            }
            else
            {
                scanf("%s",ss);
                int l=strlen(ss);
                int ans=0,cnt=0;
                str1="";
                for(int i=0;i<l;i++)
                {
                    if(ss[i]=='&') ans--;
                    else if(ss[i]=='*') ans++;
                    else str1+=ss[i];
                }
                cnt=mp[str1];
                if(cnt>0) cnt+=ans;
                else cnt=0;
                if(cnt<=0) puts("errtype");
                else
                {
                    printf("void");
                    for(int i=1;i<cnt;i++)
                    printf("*");
                    puts("");
                }
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sdau20163942/article/details/80274037