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