现在的位置: 首页 > 综合 > 正文

HDU 1274(展开字符串)

2018年02月22日 ⁄ 综合 ⁄ 共 1849字 ⁄ 字号 评论关闭
文章目录

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其他队员完成了)。

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;
}

【上篇】
【下篇】

抱歉!评论已关闭.