【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>=‘0‘ && c<=‘9‘)
11 #define islower(c) (c>=‘a‘ && c<=‘z‘)
12 char str[MAXN];
13
14 void solve() {
15     string ans = "";
16     stack<char> ops;
17     stack<int> cnts;
18     stack<string> strs;
19     int cnt;
20     int i = 0;
21
22     while (str[i]) {
23         bool found = false;
24         cnt = 0;
25         while (isdigit(str[i])) {
26             cnt = 10*cnt + str[i]-‘0‘;
27             ++i;
28             found = true;
29         }
30         if (str[i] == ‘(‘) {
31             if (!found)
32                 cnt = 1;
33             ops.push(‘(‘);
34             cnts.push(cnt);
35             strs.push(ans);
36             ans = "";
37         } else if (str[i] == ‘)‘) {
38             cnt = cnts.top();
39             cnts.pop();
40             ops.pop();
41             int r = cnt;
42             string bk = ans;
43             ans = strs.top();
44             strs.pop();
45             while (r) {
46                 if (r & 1)
47                     ans += bk;
48                 bk += bk;
49                 r >>= 1;
50             }
51         } else {
52             if (found) {
53                 string bk(cnt, str[i]);
54                 ans += bk;
55             } else {
56                 ans += str[i];
57             }
58         }
59         ++i;
60     }
61
62     cout <<ans<<endl;
63 }
64
65 int main() {
66     int t;
67 #ifndef ONLINE_JUDGE
68     freopen("data.in", "r", stdin);
69     freopen("data.out", "w", stdout);
70 #endif
71     scanf("%d", &t);
72     while (t--) {
73         scanf("%s", str);
74         solve();
75     }
76
77     return 0;
78 }
时间: 2024-10-16 07:42:54

【HDOJ】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

杭电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系统开发过程中,经常会遇到纱线排列的问题.该问题

HDU 1274 展开字符串

在纺织CAD系统开发过程中,经常会遇到纱线排列的问题. 该问题的描述是这样的:常用纱线的品种一般不会超过25种,所以分别可以用小写字母表示不同的纱线,例如:abc表示三根纱线的排列:重复可以用数字和括号表示,例如:2(abc)表示abcabc:1(a)=1a表示a;2ab表示aab;如果括号前面没有表示重复的数字出现,则就可认为是1被省略了,如:cd(abc)=cd1(abc)=cdabc;这种表示方法非常简单紧凑,也易于理解:但是计算机却不能理解.为了使计算机接受,就必须将简单紧凑的表达方式展

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;

HDU1274 展开字符串【栈】

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

[HDOJ1274]展开字符串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1274 递归题. 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 #include <cmath> 7 #include <cctype> 8 #include

ACM--26进制加法--HDOJ 2100--Lovekey--大数--字符串处理

HDOJ题目地址:传送门 Lovekey Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7783    Accepted Submission(s): 2519 Problem Description XYZ-26进制数是一个每位都是大写字母的数字. A.B.C.-.X.Y.Z 分别依次代表一个0 ~ 25 的数字,一个 n 位的26

HZNU Training 21 for Zhejiang Provincial Competition 2020

C - 展开字符串 HDU - 1274 处理括号优先级:栈保存所有的字符,遇到 数字+字符,数字拿出来,for一遍,字符填到栈里,遇到 )一直把栈里元素拿出来,直到 ( 为止,然后把这中间的元素保存下来,因为括号前面有系数,再for一遍,填到栈里,最后把栈清空,输出 题目数据有问题:没有判数字大于10情况. #include<cstdio> #include<iostream> #include<stack> #include<cstring> using

1485 字符配对

codevs——1485 字符配对 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 在一个字符串中,把相同的字符两两删除,求剩下字符的个数. 例如:字符串asasda, 首先删除两个'a',得到字符串'ssda'. 然后删除两个's',得到字符串'da'. 此时,字符串中没有了相同的字符,删除结束,剩下个数为2. 输入描述 Input Description 一个字符串,含义如描述所示. 输出描述 Output Des