zcmu 2209 (特殊模擬)
阿新 • • 發佈:2018-11-18
題目連結:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=2209
題意:
先輸入n,再輸入n行資料
每行資料有兩個種類。(*和&可以抵消)
1、typedef A B,表示用B來代替A
(1)如果A存在,且&數量小於*數量,則B是str*……;
(2)如果A不存在或者&數量大於*數量,則B是“errtype”;
2、typeof A,表示輸出A。
(1)如果A存在,且&數量小於*熟練,則輸出str型別+*……;
(2)如果A不存在或者&數量大於*數量,則輸出“errtype”;
#include<iostream> #include<cstdio> #include<string> #include<map> using namespace std; map <string,int> mp; string s1,s2,s3,s4; int main(void) { int n,ans,i,cnt,l; while(cin>>n) { mp.clear(); mp["void"]=1; while(n--) { cin>>s1; if(s1=="typedef") { cin>>s2>>s3; s4.clear(); l=s2.length();ans=0;cnt=0; for(i=0;i<l;i++) { if(s2[i]=='&') ans--; else if(s2[i]=='*') ans++; else s4+=s2[i]; } cnt=mp[s4]; if(cnt>0) cnt+=ans; else cnt=0; mp[s3]=cnt; } else { cin>>s2; s3.clear(); l=s2.length();ans=0;cnt=0; for(i=0;i<l;i++) { if(s2[i]=='&') ans--; else if(s2[i]=='*') ans++; else s3+=s2[i]; } cnt=mp[s3]; if(cnt>0) cnt+=ans; else cnt=0; if(cnt<=0) cout<<"errtype"; else { cout<<"void"; for(i=1;i<cnt;i++) cout<<"*"; } cout<<endl; } } } return 0; }
參考文章:https://blog.csdn.net/sdau20163942/article/details/80274037