hrbust 1587 Gragon Island【模拟+递归Dfs+栈】

Gragon Island

Time Limit: 1000 MS

Memory Limit: 32768 K

 

Total Submit: 13(7 users)

Total Accepted: 7(7 users)

Rating: 

Special Judge: No

 

Description

传说在很久很久以前,江湖上流传着一个叫Gragon Island的地方,传说那个地方有神龙的存在,但是那个地方所处的位置十分偏僻,而且岛上阴森可怖,因此不曾有人涉足。

当时北方有一个叫 wd 的侠客,南方有一个叫Cc的侠女,他们几乎同时对这座岛产生了兴趣,于是他们商量好结伴而行,但是当他们相遇的时候,Cc突然想考验一下wd的能力,因为担心他会拖自己的后腿,于是她给wd出了个题目:

    她说一些语句,wd要立刻还原出来,语句的主要内容是由小写的英文字母组成,但是语句中可能会有一些连续相邻的但是相同的子串,Cc会把其中一些合并,例如:2(nova)表示novanova;2nova 表示 nnova; 有些括号前可能是1,在这些情况之中有些是把1省略的,例如:nova = no(va) = no1(va)。

    如果wd可以还原出原字符串,Cc就同意和他一起去Gragon Island,但是这却没有难倒wd,因为他带了个叫扣得不牢克的神器,通过它wd轻松的将语句还原了出来,于是他们踏上了前往目的地的旅程...


Input

多组测试数据,第一行一个整数T表示语句的数量,接着是T行表述式,表述式是将按照上面介绍的规则书写,不会出现括号不匹配的情况,字符串的长度不会超过100.

Output

对于每组测试数据,输出还原之后的语句,每条语句占一行。

Sample Input

2

1(wind2m1d)

2(1tm2(ac))

Sample Output

windmmd

tmacactmacac

Author

周洲@nova

 

思路:


一层嵌套一层的情况,需要一层一层的递归输出。代码实现可能对于每个人来说难度都不同,大家尽量自己实现这里说几个关键的容易错的点吧。


易错点:


1、对于0开头的数字引导的字符串,为空。


2、对于省略掉的1,直接以这样形式出现的字符串,为1次字符串(dfdf(dfdf))==dfdfdfdf


3、对于字符串的匹配,千万记住,处理完一个括号,结束一个括号内所有的操作。(这里我用栈来实现)


AC代码(写的有些挫,大家多担待):

#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
char a[5000000];
char b[5000000];
int n,cont;
void Dfs(int now,int cur)
{
    for(int i=0;i<cur;i++)
    {
        for(int i=now;i<n;i++)
        {
            if(a[i]=='(')
            {
                Dfs(i+1,1);
                stack<char >s;
                s.push('(');
                int z;
                for(z=i+1;z<n;z++)
                {
                    if(a[z]=='(')s.push(a[z]);
                    if(a[z]==')')s.pop();
                    if(s.size()==0)break;
                }
                i=z;continue;
            }
            if(a[i]==')')
            {
                break;
            }
            if(a[i]>='0'&&a[i]<='9')
            {
                int tmp=0;
                int j;
                for(j=i;j<n;j++)
                {
                    if(a[j]>='0'&&a[j]<='9')
                    {
                        tmp=tmp*10+a[j]-'0';
                    }
                    else
                    {
                        break;
                    }
                }
                if(a[j]=='(')
                {
                    Dfs(j+1,tmp);
                    stack<char >s;
                    s.push('(');
                    int z;
                    for(z=j+1;z<n;z++)
                    {
                        if(a[z]=='(')s.push(a[z]);
                        if(a[z]==')')s.pop();
                        if(s.size()==0)break;
                    }
                    i=z;
                }
                else
                {
                    i=j;
                    while(tmp--)
                    {
                        b[cont++]=a[j];
                    }
                }
            }
            else
            {
                b[cont++]=a[i];
            }
        }
        b[cont]='\0';
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,'\0',sizeof(a));
        memset(b,'\0',sizeof(b));
        scanf("%s",a);
        n=strlen(a);
        for(int i=0;i<n;i++)
        {
            if(a[i]=='(')
            {
                cont=0;
                Dfs(i+1,1);
                printf("%s",b);
                stack<char >s;
                s.push('(');
                int z;
                for(z=i+1;z<n;z++)
                {
                    if(a[z]=='(')s.push(a[z]);
                    if(a[z]==')')s.pop();
                    if(s.size()==0)break;
                }
                i=z;
            }
            if(a[i]==')')continue;
            if(a[i]>='0'&&a[i]<='9')
            {
                int tmp=0;
                int j;
                for(j=i;j<n;j++)
                {
                    if(a[j]>='0'&&a[j]<='9')
                    {
                        tmp=tmp*10+a[j]-'0';
                    }
                    else
                    {
                        break;
                    }
                }
                if(a[j]=='(')
                {
                    cont=0;
                    Dfs(j+1,tmp);
                    printf("%s",b);
                    stack<char >s;
                    s.push('(');
                    int z;
                    for(z=j+1;z<n;z++)
                    {
                        if(a[z]=='(')s.push(a[z]);
                        if(a[z]==')')s.pop();
                        if(s.size()==0)break;
                    }
                    i=z;
                }
                else
                {
                    i=j;
                    while(tmp--)
                    {
                        printf("%c",a[j]);
                    }
                }
            }
            else
            {
                printf("%c",a[i]);
            }
        }
        printf("\n");
    }
}
/*
2(fuck2(a2(c)))
*/






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值