hrbust 1587 Gragon Island【模拟+递归Dfs+栈】
2016-06-27 18:36
387 查看
Gragon Island | ||||||
| ||||||
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)))
*/
相关文章推荐
- Go语言_Go语言的channel
- mongo 更新数组 键值对
- beego使用migrate错误
- Go语言学习:Channel
- 研究Extension和Category的一个例子
- POJ 2195 Going Home (最小费用最大流)
- 论文笔记 | Going deeper with convolutions
- Django项目结构布局
- LightOJ 1030 Discovering Gold
- mongo的数据备份
- Poj 2723 Go Deeper【2-SAT-----Tarjan强连通+二分】
- 特殊矩阵——三对角矩阵(Tridiagonal Matrix)
- hdu_3966_Aragorn's Story(树链剖分裸题)
- hdu_3966_Aragorn's Story(树链剖分裸题)
- 【读书笔记】Zygote 和 System 进程的启动过程
- 谷雪梅 Google中国
- Go语言学习笔记1
- 贪婪算法(Greedy Algorithm)
- 课后作业静态网页制作-仿Argo官网
- GOF-23种设计模式——装饰模式(学习笔记)