繁琐的模拟题,本来不打算做的,正当退缩的时候突然发现,好像实现起来代码量挺少的,就那么几个情况,于是写了一会就过了,也不算太复杂,找到了刚学算法的时候做题的那种感觉(雾),模拟大法好啊 ~~

主要是分类讨论,用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;
}