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