繁琐的模拟题,本来不打算做的,正当退缩的时候突然发现,好像实现起来代码量挺少的,就那么几个情况,于是写了一会就过了,也不算太复杂,找到了刚学算法的时候做题的那种感觉(雾),模拟大法好啊 ~~
主要是分类讨论,用vector G[maxn]存起来每一类,括号()的全部放到一个vector,不然就下一个vector,读{digit} 的时候用个数组pos储存该vector的元素出现几次即可。
#include <cctype> #include <cfloat> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <algorithm> #include <deque> #include <fstream> #include <functional> #include <iomanip> #include <iostream> #include <istream> #include <iterator> #include <list> #include <map> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector> #define ll long long #define pll pair<long long,long long> #define P pair<int,int> #define eps 1e-4 using namespace std; const int maxn=1e4+10; vector<string> G[maxn]; int pos[maxn]; int main() { char ch; int idx=0; string str=""; bool ok=false; while ((ch=getchar())&&ch!=EOF) { if (ch==' ') continue; if (!islower(ch)&&str!="") { G[idx].push_back(str); if (!ok) idx++; str=""; } if (ch=='{') { int sum=0; while (ch=getchar()) { if (ch==' ') continue; if (ch=='}') break; sum=sum*10+ch-'0'; } pos[idx-1]=sum; } else if (ch=='(') { ok=true; } else if (ch==')') { ok=false; idx++; } else if (islower(ch)) { str+=ch; } else if (isupper(ch)) { str=ch; } } for (int i=0; i<idx; i++) if (pos[i]==0) pos[i]=1; for (int i=0; i<idx; i++) for (int k=0; k<G[i].size(); k++) for (int j=0; j<pos[i]; j++) cout<<G[i][k]; return 0; }