HDU 1274 展开字符串

在纺织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

题目大意:将一串形如1(1a2b1(ab)1c)的字符串展开,展开时按照前面的数字展开,可以得到abbabc。

大致思路:看到这种具有多次类似操作的展开可以想到递归,从左向右读取字符,遇到(则递归,否则直接输出。这里有几个小tips。1.isdigit(c)函数,如果c是数字返回非0值,否则返回NULL 2.读取数字时用 i=i*10+c-‘0‘,i*10就可以表示两位数。3.递归函数是有返回值的,在不是直接输出字符串的情况,需要递归调用之前的展开次数。详见代码。

#include<iostream>
using namespace std;
#include<cstdio>
#define maxn 255
char s[maxn];
int fun(int n)
{
    char c;
    for(c=s[0];c!=‘)‘&&n<s.size();c=s[n++])//迭代终止于右括号和小于字符串长度
    {
        for(int i=0;isdigit(c);c=s[n++])//判断是否为数字
            i=i*10+c-‘0‘;//如果c是数字,c-‘0‘返回就是int类型的c
        if(i!=0)//第一个字符就是字母
            i=1;
        if(c==‘(‘)//如果是左括号递归调用函数获取后面的字符串
        {
            while(i--)
                temp=fun(n);
            n=temp;
        }
        else//不是的话直接输出数字后的字母
        {
            while(i--)
                putchar(c);
        }
    }
    if(c==‘)‘)//如果碰到右括号就返回这个括号前的值
        return n;
}
int main()
{
    int T;
    cin>>T;
    getchar();//把换行吃掉
    while(T--)
    {
        cin>>s;
        int len=strlen(s);
        fun(0);
    }
    return 0;
}
时间: 2024-10-26 20:17:12

HDU 1274 展开字符串的相关文章

HDU 1274 展开字符串 (递归+string类)

题目链接:HDU 1274 展开字符串 中文题. 左括号进入DFS函数,右括号return到上一层. 注意return回去的是这个一层递归中的括号中的字母串. AC代码: #include<stdio.h> #include<iostream> #include<string.h> #include<string> using namespace std; char str[300]; bool vis[300]; int len; string dfs(i

hdu 1274 展开字符串 (简单dfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1274 思路: 找到匹配的区间 之后dfs #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; char str[300]; void dfs(int l,int r) { int i,j,k;

杭电acm 1274展开字符串

原题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1274 展开字符串 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3355    Accepted Submission(s): 1619 Problem Description 在纺织CAD系统开发过程中,经常会遇到纱线排列的问题.该问题

【HDOJ】1274 展开字符串

栈的应用,需要注意括号前可能没有数字的情况. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <iostream> 5 #include <stack> 6 #include <string> 7 using namespace std; 8 9 #define MAXN 300 10 #define isdigit(c) (c>=

hdu 5510 Bazinga(字符串kmp)

Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2287    Accepted Submission(s): 713 Problem Description Ladies and gentlemen, please sit up straight.Don't tilt your head. I'm serious.For

HDU 4639 Hehe(字符串处理,斐波纳契数列,找规律)

题目 //每次for循环的时候总是会忘记最后一段,真是白痴.... //连续的he的个数 种数 //0 1 //1 1 //2 2 //3 3 //4 5 //5 8 //…… …… //斐波纳契数列 //不连续的就用相乘(组合数)好了 #include<iostream> #include<algorithm> #include<string> #include <stdio.h> #include <string.h> #include &l

hdu 4632 子字符串统计的区间dp

题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. 简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就 知道了,若已经知道[0,i],推[0,i+1], 显然还要从i+1 处往回找,dp方程也简单: dp[j][i]=(dp[j+1][i]+dp[j][i-1]+10007-dp[j+1][i-1])%10007; 减去中间一段重复的 if(s[i]==s[j])dp[j][i]=(dp[j][i]+dp[j+1][i-

HDU 1274 递归拼接字符串

题目大意: 根据所给的数字,表示其相连的字符的输出个数,或是下一个括号中的所有字符的输出个数 每一个相互对应的 '(' 和 ')' 中的所有字母均作为一组数据处理 在每一次dfs过程中都处理好这样一个对应组中间的字符 再根据前面所带的数字k 循环k次输出自己要的数据 每次输出一个字母,因为无论多复杂的字符串都能够转化成最后只带一个数字和一个字母连接的形式,第38行代码有较详细解释 1 #include <cstring> 2 #include <cstdio> 3 4 using

HDU1274 展开字符串【栈】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1274 题目大意: 为了表示纺织CAD系统的纱线排列问题.用小写字母来表示不同的纱线,连接在一起表示纱线的组合. 前边加数字表示重复多少次.比如2(abc),a.b.c表示不同的纱线,abc表示纱线组合,2+()表示abc 重复两次,即abcabc.如果前边没有数字,则默认为1.现在给你一个这样的字符串,请将表达式展开 输出排列结果. 思路: 使用栈操作,将字符串展开.重点在于去括号. 1)如果遇到