您的位置:首页 > 编程语言 > Go语言

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

2016-06-27 18:36 387 查看
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)))
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息