Problem Description
在纺织CAD系统开发过程中,经常会遇到纱线排列的问题。
该问题的描述是这样的:常用纱线的品种一般不会超过25种,所以分别可以用小写字母表示不同的纱线,例如:abc表示三根纱线的排列;重复可以用数字和括号表示,例如:2(abc)表示abcabc;1(a)=1a表示a;2ab表示aab;如果括号前面没有表示重复的数字出现,则就可认为是1被省略了,如:cd(abc)=cd1(abc)=cdabc;这种表示方法非常简单紧凑,也易于理解;但是计算机却不能理解。为了使计算机接受,就必须将简单紧凑的表达方式展开。某ACM队接受了此项任务。现在你就是该ACM队的一员,请你把这个程序编写完成。
已知条件:输入的简单紧凑表达方式的长度不超过250个字符;括号前表示重复的数不超过1000;不会出现除了数字、括号、小写字母以外的任何其他字符;不会出现括号不配对等错误的情况(错误处理已由ACM其他队员完成了)。
该问题的描述是这样的:常用纱线的品种一般不会超过25种,所以分别可以用小写字母表示不同的纱线,例如:abc表示三根纱线的排列;重复可以用数字和括号表示,例如:2(abc)表示abcabc;1(a)=1a表示a;2ab表示aab;如果括号前面没有表示重复的数字出现,则就可认为是1被省略了,如:cd(abc)=cd1(abc)=cdabc;这种表示方法非常简单紧凑,也易于理解;但是计算机却不能理解。为了使计算机接受,就必须将简单紧凑的表达方式展开。某ACM队接受了此项任务。现在你就是该ACM队的一员,请你把这个程序编写完成。
已知条件:输入的简单紧凑表达方式的长度不超过250个字符;括号前表示重复的数不超过1000;不会出现除了数字、括号、小写字母以外的任何其他字符;不会出现括号不配对等错误的情况(错误处理已由ACM其他队员完成了)。
Input
本题有多个测试数据组,第一行输入的就是数据组数N,接着就是N行表达式,表达式是按照前面介绍的意义书写的。
Output
输出时含有N行,每行对应一个输入的表达式。
Sample Input
2 1(1a2b1(ab)1c) 3(ab2(4ab))
Sample Output
abbabc abaaaabaaaababaaaabaaaababaaaabaaaab
#include<stdio.h> #include<string.h> int i,j,topc,tops,t,sh[300],m[5],js[250]; char str[300],s[250][400000],temp[400000]; int main() { while(scanf("%d",&t)==1) { while(t--) { getchar(); scanf("%s",str); topc=tops=0; int e=-1,flog=0,n=0; memset(js,0,sizeof(js));//每次清0,js代表s字符串的个数 for(i=0,js[tops]=0;str[i]!='\0';i++) { if(str[i]>='0'&&str[i]<='9')//是数字先存起来,下边进行转成一个整数 { m[++e]=str[i]-'0'; } else { int k,c; if(e>=0)//把单个数字转成一个整数 { k=0,c=1; for(;e>=0;e--) { k=k+m[e]*c; c*=10; } flog=1;//用于判断是否有过数字转换 } if(str[i]=='(') { if(flog)//判断是否有过数字转换,没有则说明默认为1 sh[topc++]=k;//sh是当前括号的个数 else sh[topc++]=1; if(n)//(当有字母出现时,tops才能加1,才能到下一个s字符串)出现左括号,则下一个字符串与前一个串隔开 tops++; js[tops]=0; n=1; } else if(str[i]!=')')//当为字母时 { n=1; j=js[tops]; if(flog)//有数字转换过,则用之 { for(;j<k+js[tops];)//把k个字母接在第tops个s字符串的后面 s[tops][j++]=str[i]; } else//没有数字转换,则默认为1个字母接在后面 s[tops][j++]=str[i]; s[tops][j]='\0';//每次一个字符串后面都接上一个结束符 js[tops]=j;//第tops个s字符串的长度 } else if(str[i]==')')//表明当明前的字符串己经真正的结束 { int d; if(tops) { int len=strlen(s[tops]); for(d=1;d<=sh[topc-1];d++)//(有等号)所以把当前的字符串接在前一个字符串后面 { strcat(s[tops-1],s[tops]); js[tops-1]+=len;//前面的串长度也会变长 } tops--;//接完后就指向前一个字符串 } else { temp[0]='\0';//注意中间变量的字符串 strcat(temp,s[tops]);//最后一个字符串复给中间字符串 for(d=1;d<sh[topc-1];d++)//最后一个串有多少个(注意没有等号) strcat(s[tops],temp); } topc--;//指向前一个括号的倍数 } flog=0; } } printf("%s\n",s[0]); } } return 0; }