zcmu 2018 Memory leak(模擬)
阿新 • • 發佈:2018-12-14
【題目】
【題意】
搞了一個小時發現題意理解錯了orz這是什麼神仙題目。
關鍵點在於當一個字串比預期的長的時候會訪問下一個記憶體,直到記憶體長度滿足預期。
做出來還是很開心的哇!!!!
【思路】
模擬。三個map用來關聯變數名、序號、長度和存入的內容。
【程式碼】
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <list> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <iostream> #define go(i,a,b) for(int i=a;i<=b;i++) #define og(i,a,b) for(int i=a;i>=b;i--) #define mem(a) memset(a,0,sizeof(a)) using namespace std; map <string,int> si; map <int,int> len; map <int,string> is; string s,name,na; main() { int t; scanf("%d",&t); getchar(); while(t--) { int c=0; si.clear();is.clear();len.clear(); while(getline(cin,s)) { if(s[3]=='u') break; int l=s.size(),i=5; if(s[3]=='r') { while(i<l) { name=s[i++]; while(s[i]!='[') name+=s[i++]; si[name]=c; int ll=0; i++; while(s[i]>='0'&&s[i]<='9') ll=ll*10+s[i]-'0',i++; len[c++]=ll; //cout<<ll<<endl; while(s[i-1]!=' '&&i<l) i++; } } else if(s[3]=='s') { name=s[5]; i++; while(s[i]!=' ') name+=s[i++]; na=s[i+1]; i+=2; while(i<l) na+=s[i++]; is[si[name]]=na; } else { name=s[i++]; while(i<l) name+=s[i++]; int q=si[name]; if(is[q].size()<len[q]) cout<<is[q]<<endl; else { while(is[q].size()>=len[q]&&q<c) { go(i,0,len[q]-1) cout<<is[q][i]; q++; } if(is[q].size()<len[q]) cout<<is[q]; puts(""); } } } } }