题目链接: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;
}