当前位置: 代码迷 >> 综合 >> CodeForces - 87B - Vasya and Types
  详细解决方案

CodeForces - 87B - Vasya and Types

热度:55   发布时间:2024-01-12 15:18:58.0

题目链接: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;
}
  相关解决方案