题目链接:点击打开链接
题目大意:略。
解题思路:注意:“return 0;” 的时候别只输了个 “return” 就退出了,要输完,否则 T-- 会消耗掉一次,导致结果WA。
AC 代码
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a) #define INF 0x3f3f3f3f using namespace std; typedef long long ll; struct node { int len,flag; // 数组长度 是否泄漏 string txt,name; // 内容 数组名 }nds[11000]; map<string,int> mp; map<string,int>::iterator itmp; void init() { mp.clear(); } void showNode(int op,string name) { itmp=mp.begin(); while(itmp!=mp.end()) { if(op==1) { node nd=nds[itmp->second]; cout<<nd.name<<": "; cout<<nd.len<<endl; puts("------------------------------"); } else if(op==2) { if(itmp->first==name) { node nd=nds[itmp->second]; cout<<nd.name<<": "<<endl; cout<<"len: "<<nd.len<<endl; cout<<"flag: "<<nd.flag<<endl; cout<<"txt: "<<nd.txt<<endl; puts("------------------------------"); } } itmp++; } } int main() { int T; scanf("%d",&T); int n; string s,ss,sss; while(T--) { init(); int nlen=0; while(1) { cin>>s; char op=s[3]; if(op=='r') // char { while(cin>>ss) { char name[11000]; int len=ss.length(),k=0; int i; for(i=0;i<len;i++) { if(ss[i]=='[') { name[k++]='\0'; break; } else name[k++]=ss[i]; } int sum=0; for(++i;i<len;i++) { if(ss[i]==']') break; else sum=sum*10+(ss[i]-'0'); } node nd; nd.flag=0,nd.len=sum,nd.txt="",nd.name=string(name); mp[nd.name]=++nlen; nds[nlen]=nd; if(ss[len-1]==';') break; } // showNode(1,""); } else if(op=='s') // gets { cin>>ss; getchar(); getline(cin,sss); int len=sss.length(); node &nd=nds[mp[ss]]; if(len>=nd.len) { nd.flag=1; nd.txt=sss.substr(0,nd.len); } else { nd.flag=0; nd.txt=sss; } // showNode(2,ss); } else if(op=='t') // cout { cin>>ss; int i=mp[ss]; while(i<=nlen) { node nd=nds[i]; cout<<nd.txt; if(nd.flag==1) i++; else break; } puts(""); } else if(op=='u') // return { cin>>ss; break; } } } return 0; }