Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 239 Accepted Submission(s): 91
2 1(1a2b1(ab)1c) 3(ab2(4ab))
abbabc abaaaabaaaababaaaabaaaababaaaabaaaab
链接网址:http://acm.hdu.edu.cn/showproblem.php?pid=1274
算法:
用了最直接,最暴力的方法。一层层展开。从右到左,遇到(或是数字就展开。
一开始想了很多,想得很复杂,但都没办法想下去。于是,就用最简单的方法,直接AC了。原以为是超时的
。幸好数据不是很大。用了两个字符数组,一个用于存重复内容。一个存后辍
具体做法。
统一性。
1。没括号的,数字+字母,字母这两种类型。当成数字+(字母),(字母)类型。重复内容,直接是单个字母。
2。没数字的,字母,(字符串),当成1+字母,1+(字符串)类型。重复次数是1次。
这样就把上面的所有情况统一化了。之后只要一个函数就可以完成每一次的重复内容的。
下面是AC代码:
#include<stdio.h> #include<string.h> char str[3000001]; char ans[1000000]; char help[100000]; int n,len; void solve_other(int sum,char help[],char ans[],int k) { int p,q; for(p=1;p<=sum;p++) { for(q=0;help[q]!=0;q++) { str[k++]=help[q]; } } for(q=0;ans[q]!=0;q++) { str[k++]=ans[q]; } len=k; } void solve() { int i,j; int p,q,k; int sum; for(i=n-1;i>=0;i--) { if(str[i]=='(') { for(j=i+1;;j++) { if(str[j]==')') { help[j-i-1]=0; break; } help[j-i-1]=str[j]; } sum=0; p=1; while(i-1>=0&&str[i-1]>='0'&&str[i-1]<='9') { sum=(str[i-1]-'0')*p+sum; p=p*10; i--; } if(sum==0) sum=1; for(q=j+1;q<len;q++) { ans[q-j-1]=str[q]; } ans[q-j-1]=0; k=i; solve_other(sum,help,ans,k); } else if(str[i]>='0'&&str[i]<='9') { sum=0; p=1; j=i+1; while(i>=0&&str[i]>='0'&&str[i]<='9') { sum=(str[i]-'0')*p+sum; p=p*10; i--; } i++; if(sum==0) sum=1; if(j<n) { help[0]=str[j]; help[1]=0; for(p=j+1;p<len;p++) { ans[p-j-1]=str[p]; } ans[p-j-1]=0; solve_other(sum,help,ans,i); } } } str[len]=0; } int main() { int k; scanf("%d",&k); while(k--) { scanf("%s",str); n=strlen(str); len=n; solve(); printf("%s/n",str); } return 0; }