uva 12219(表达式树)

作者参加前端培训课程,并分享了使用C++实现表达式树的过程及代码。文章涉及了表达式树的构建和遍历,同时提到了培训中教授Photoshop的内容,决定自行刷题提升。

哈哈哈,活了,寒假好好刷题,过来参加了个前端培训,教了一天ps??????明天不听了,上课刷题。还有,紫书上的表达式树的板子好像有问题

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
const int maxn=50000+100;
int dd[maxn];
int k,t,cnt,p;
string ss;
struct note
{
    string cc;
    int aa,left,right;
   bool operator < (const note &p) const//map要有序
   {
       if(aa!=p.aa) return aa<p.aa;
       if(left!=p.left) return left<p.left;
       return right<p.right;
   }
}s[maxn];
map<note,int> mmp;
int solved()
{
    int id=cnt++;
    note &nn=s[id];
    nn.aa=0;
    nn.left=nn.right=-1;
    nn.cc="";
    while(isalpha(ss[p]))//存个节点
    {
        nn.aa=nn.aa*27+ss[p]-'a'+1;
        nn.cc.push_back(ss[p]);
        p++;
    }
    if(ss[p]=='(')//二叉树,只要所有左括号,必有逗号和右括号
    {
        p++;
        nn.left=solved(); 
        p++;//逗号
        nn.right=solved(); 
        p++;//右括号
    }
    if(mmp[nn])//已经存在,跳过
    {
        cnt--;
        return mmp[nn];
    }
   return mmp[nn]=id;
}
void print(int v)
{
    if(dd[v]==k) printf("%d",v+1);//dd[v]就是个标记的作用,拿每层的k标记,就不用清零了
    else
    {   dd[v]=k;
            cout << s[v].cc;
        if(s[v].left!=-1)//同上二叉树性质
        {
          putchar('(');
          print(s[v].left);
          putchar(',');
          print(s[v].right);
          putchar(')');
        }
    }
}
int main()
{
    scanf("%d",&t);
    for(k=1;k<=t;k++)
    {
        mmp.clear();
        p=cnt=0;
        cin >> ss;
        print(solved());
        printf("\n");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/Wangwanxiang/p/8325487.html

UVA 13300 是一个编程和算法挑战相关的题目,虽然该题目的具体内容未在引用中详细列出,但可以根据常见的UVA问题类型和背景进行推测。这类问题通常涉及复杂的逻辑推理、数学计算或特定算法的应用。根据类似题目的解决思路,可以推测解决UVA 13300可能需要掌握以下关键点: 1. **问题理解建模**:首先需要仔细阅读题目描述,明确输入输出的要求,并根据问题背景建立数学模型或算法框架。例如,题目可能涉及字符串处理、动态规划、图论或数论等基础算法。 2. **算法选择优化**:根据问题特性选择合适的算法。例如,如果问题涉及排列组合或递归,可能需要使用深度优先搜索(DFS)或广度优先搜索(BFS);如果问题涉及最优化或重复子问题,可能需要使用动态规划(DP)或贪心算法。 3. **数据结构设计**:为了提高程序效率,通常需要选择合适的数据结构。例如,使用哈希表进行快速查找、使用堆进行优先队列管理、使用结构处理层次化数据等。 4. **代码实现调试**:在编码过程中,需要注意边界条件、输入输出格式以及可能的错误情况。例如,在处理字符串时,需要考虑空格、换行符和特殊字符的处理;在处理数值计算时,需要注意整数溢出和浮点精度问题。 5. **测试优化**:编写完代码后,需要通过样例输入进行测试,确保程序能够正确处理各种情况。此外,还需要对程序进行性能优化,确保在大规模输入下仍能高效运行。 以下是一个通用的编程框架,可用于处理类似问题: ```python def main(): import sys input = sys.stdin.read data = input().splitlines() # 根据题目要求解析输入数据 # 例如,读取多个测试用例 for line in data: # 处理每一行数据 pass # 输出结果 print("Result") if __name__ == "__main__": main() ``` 对于UVA 13300的具体问题,假设其涉及字符串处理和数字提取,可以参考类似问题的解决方法[^2]。例如,使用正则表达式提取输入中的数字,并将其存储在数组中进行比较。 ```python import re def extract_numbers(s): return list(map(int, re.findall(r'\d+', s))) def compare_outputs(output1, output2): return extract_numbers(output1) == extract_numbers(output2) # 示例用法 output1 = "The answer is 42." output2 = "The answer is 42." print(compare_outputs(output1, output2)) # 输出: True ``` 在解决此类问题时,还需要注意以下几点: - **输入输出格式**:严格按照题目要求处理输入输出,避免因格式错误导致答案错误(WA)。 - **特殊情况处理**:考虑输入为空、输入格式异常等情况,确保程序的鲁棒性。 - **性能优化**:对于大规模输入,使用高效的算法数据结构,避免超时(TLE)。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值