hdu 4041

题意:如下图

遍历树的方法是粉色箭头所示

此图的输入是”walpurgis(charlotte(patricia,gertrud),elly,gisela)”

要求输出经过的结点名称,和每一步的起点和终点。

题解:用栈维护,遇到’(‘把’(‘前面的数字输出并压栈,如果遇到’,’,输出当前点和栈顶,如果遇到’)’,输出当前点和栈顶并把栈顶数字弹出。

#include <stdio.h>
#include <stack>
#include <string.h>
using namespace std;
const int N = 1000005;
const int M = 50005;
char str[N], room[M][15];
int res[N];
stack<int> s;

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        while (!s.empty())
            s.pop();
        scanf("%s", str);
        int len = strlen(str);
        int k = 0, ss = 0, cnt = 0;
        for (int i = 0; i < len; i++) {
            if (str[i] <= ‘z‘ && str[i] >= ‘a‘)
                room[k][ss++] = str[i];
            else if (str[i] == ‘(‘) {
                room[k][ss] = 0;
                ss = 0;
                k++;
                s.push(k);
                res[cnt++] = k;
            }
            else if (str[i] == ‘)‘) {
                if (str[i - 1] != ‘)‘) {
                    room[k][ss] = 0;
                    k++;
                }
                else {
                    s.pop();
                    res[cnt++] = s.top();
                    ss = 0;
                    continue;
                }
                ss = 0;
                res[cnt++] = k;
                res[cnt++] = s.top();
            }
            else if (str[i] == ‘,‘) {
                if (str[i - 1] != ‘)‘) {
                    room[k][ss] = 0;
                    k++;
                }
                else {
                    s.pop();
                    res[cnt++] = s.top();
                    ss = 0;
                    continue;
                }
                ss = 0;
                res[cnt++] = k;
                res[cnt++] = s.top();
            }
        }
        if (k == 0) {
            printf("1\n");
            for (int i = 0; i < len; i++)
                if (str[i] <= ‘z‘ && str[i] >= ‘a‘)
                    printf("%c", str[i]);
            printf("\n\n");
            continue;
        }
        printf("%d\n", k);
        for (int i = 0; i < k; i++)
            printf("%s\n", room[i]);
        for (int i = 0; i < cnt - 1; i++)
            printf("%d %d\n", res[i], res[i + 1]);
        printf("\n");
    }
    return 0;
}
时间: 2024-10-04 06:35:16

hdu 4041的相关文章

HDU 4041 Eliminate Witches! (栈的模拟)

Eliminate Witches! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1234    Accepted Submission(s): 461 Problem Description Kaname Madoka is a Magical Girl(Mahou Shoujo/Puella Magi). The duty of

hdu 4041 2011北京赛区网络赛F 组合数+斯特林数 ***

插板法基础知识 斯特林数见百科 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #define LL long long 6 #define eps 1e-7 7 #define MOD 1000000007 8 using namespace std; 9 int c[2001][2001]={1},stir2[1005][1005]={1};

HDU 4041 Eliminate Witches! --模拟

题意: 给一个字符串,表示一颗树,要求你把它整理出来,节点从1开始编号,还要输出树边. 解法: 模拟即可.因为由括号,所以可以递归地求,用map存对应关系,np存ind->name的映射,每进入一层括号,使father = now, 遇到右括号')',则father = fa[father],用vector存每个节点的子节点,然后最后dfs输出即可. 代码: #include <iostream> #include <cstdio> #include <cstring&

hdu 4041 2011北京赛区网络赛B 搜索 ***

直接在字符串上搜索,注意逗号的处理 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 #define pb

HDU ACM 4041 Eliminate Witches! 队列和栈模拟DFS

分析:直接模拟即可,这里用队列记录访问过的点,栈记录父节点.另外要注意的是在strlen(str)计算字符串的时候要预先计算出来保存在变量中,for直接用,如果for循环直接调用strlen,那么每次都会重新计算,该題字符串的数据量很大,就会存在大量的无用计算,还导致了一次TLE,唉!以前没注意到这里. #include<iostream> #include<vector> #include<queue> #include<stack> using name

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};