zoukankan      html  css  js  c++  java
  • HDU 1274(展开字符串)

    展开字符串

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 722 Accepted Submission(s): 292


    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
    View Code
     1 //改成这样就TLE 
     2 
     3 //遇到左括号进入下层递归,
     4 //否则一直按每个字母前面的数字决定其输出的次数
     5 #include <iostream>
     6 #include <cctype>
     7 #include <cstring>
     8 #include <string>
     9 using namespace std;
    10 
    11 string s;
    12 int fun(int step)
    13 {
    14      int k,e;
    15      char ch;
    16      for(ch=s[step++];step<s.size()&&ch!=')';ch=s[step++])//递归结束的条件是字符串结束或遇到右括号 
    17      {
    18           for(k=0;isdigit(ch);ch=s[step++])//isdigit若非数字返回0 
    19               k=k*10+ch-'0';
    20           /*
    21           下面的错了,还不知怎么改动 
    22           if(isdigit(ch))
    23           {
    24                sscanf(&ch,"%d",&k);
    25                ch=s[step];
    26                //step++;
    27           }
    28           */
    29           if(k>0) 
    30                k=1;
    31           if(ch=='(')
    32           {
    33               while(k--)
    34                   e=fun(step);
    35               step=e;//重置step的值,到下层递归结束的位置 
    36           }
    37           else
    38           {
    39               while(k--)
    40                   putchar(ch);
    41           }
    42      }
    43      if(ch==')') 
    44           return step;//返回本次读到结尾的位置 
    45 }
    46 int main()
    47 {
    48      int i,j,k,T;
    49      cin>>T;
    50      while(T--)
    51      {
    52           s.clear();
    53           cin>>s;
    54           fun(0);
    55           cout<<endl;
    56      }
    57      return 0;
    58 }
     1 #include <iostream>
     2 #include <cctype>
     3 #include <cstring>
     4 #include <string>
     5 using namespace std;
     6 
     7 string s;
     8 int fun(int ith)
     9 {
    10      int k,e;
    11      char c;
    12      for(c=s[ith++];ith<s.size()&&c!=')';c=s[ith++])//递归结束的条件是字符串结束或遇到右括号 
    13      {
    14           for(k=0;isdigit(c);c=s[ith++])
    15               k=k*10+c-'0';
    16           if(!k) k=1;
    17           if(c=='('){
    18               while(k--)
    19                   e=fun(ith);
    20               ith=e;//重置ith的值,到下层递归结束的位置 
    21      }
    22      else
    23      {
    24          while(k--)
    25              putchar(c);
    26      }
    27  }
    28  if(c==')') return ith;//返回本次读到结尾的位置 
    29 }
    30 int main()
    31 {
    32      int i,j,k,T;
    33      cin>>T;
    34      while(T--)
    35      {
    36           s.clear();
    37           cin>>s;
    38           fun(0);//进入递归 
    39           cout<<endl;
    40      }
    41      return 0;
    42 }
     
  • 相关阅读:
    C++ STL list
    1159 Palindrome
    3070 Fibonacci
    1458 Common Subsequence
    git工具之重写历史
    git工具之修订版本(revision)选择
    git工具之使用git调试
    程序员也要听歌啊 写写歌词~(毛不易)《借》《消愁》《像我这样的人》
    git基本命令讲解
    git工作原理
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2663438.html
Copyright © 2011-2022 走看看