HDU

来源:互联网 发布:帮助记忆的音乐知乎 编辑:程序博客网 时间:2024/06/06 02:52

传送门


思路:数据量并不大, 我们只需模拟即可,分两种策略

  step1 : 如果是数字, 代表需要循环输出, 此时又分两种策略

              1:如果后面是“(”, 则需要循环一个字符串, 即递归即可

              2:如果后面是单个字母, 只需把后面的一个字母循环输出多次即可。

  step2:如果是字母, 直接输出


也就是说我们写的函数就是要输出后面字符串需要的次数,如果碰到了数字, 我们循环几次这个函数即可, 这就需要我们知道从哪个地方开始输出, 而且这个函数结束之后我们要知道已经进行到哪里了。因为后面的循环了之后,不需要再找了, 已经循环输出了。


AC代码:

#include <iostream>#include <cstdio>using namespace std;string ss;int fun(int x){    char ch;    int k;    for(ch = ss[x++]; ch != ')' && x < ss.size(); ch = ss[x++])  //如果碰到“)”, 直接返回即可, 此时没有等待返回值的情况,不需要返回值    {        for(k = 0; ch <= '9' && ch >= '0'; ch = ss[x++]) k = k*10 + ch - '0';  //把数字找出来, 可能不止一位        if(!k) k = 1; // 如果前面没有数字,证明只需要输出一次, 覆盖成1        if(ch == '(')        {            int tmp;            while(k--)                tmp = fun(x);            x = tmp;    //更新x的值, 因为之前的已经解决了(循环输出了), 直接在后面继续即可        }        else while(k--) putchar(ch);    }    if(ch == ')') return x;   //如果是“)”, 说明上一层函数的tmp在等待返回值, 我们需要返回当前输出到哪里了}int main(){    int N;    cin >> N;    while(N--)    {        cin >> ss;        fun(0);        puts("");    }    return 0;}

原创粉丝点击