USACO American Heritage 解题报告
2013-10-27 10:00
429 查看
这道题是给了树的中序遍历和前序遍历,求后序遍历。
我的解法中有大量的字符串合并操作,实际上完全不需要,直接输出字符即可。
我的解法中有大量的字符串合并操作,实际上完全不需要,直接输出字符即可。
/* ID: thestor1 LANG: C++ TASK: heritage */ #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <climits> #include <cassert> #include <string> #include <vector> #include <set> #include <queue> #include <stack> #include <algorithm> using namespace std; string tree(int lin, int rin, int lpre, int rpre, string in, string pre) { // cout<<lin<<", "<<rin<<", "<<lpre<<", "<<rpre<<", "<<in<<", "<<pre<<endl; if(lin > rin) { return ""; } if(lin == rin) { return string(1, in[lin]); } int root = lin; // cout<<lpre<<":"<<pre[lpre]<<endl; while(in[root] != pre[lpre] && root <= rin) { root++; } assert(root <= rin); int left = root - 1 - lin + 1; // cout<<"root: "<<root<<", left: "<<left<<endl; return tree(lin, root - 1, lpre + 1, lpre + 1 + left - 1, in, pre) + tree(root + 1, rin, lpre + left + 1, rpre, in, pre) + string(1, in[root]); } int main() { FILE *fin = fopen ("heritage.in", "r"); FILE *fout = fopen ("heritage.out", "w"); //in-order char buff[27]; fscanf(fin, "%[^\n]%*c", buff); string in(buff); fscanf(fin, "%[^\n]%*c", buff); string pre(buff); int n = in.length(); string post; post.reserve(n); post = tree(0, n - 1, 0, n - 1, in, pre); // cout<<post<<endl; fprintf(fout, "%s\n", post.c_str()); return 0; }
相关文章推荐
- USACO :Cow Pedigrees解题报告
- USACO:Cow Tours解题报告
- USACO 2.4.2 穿越栅栏(原题) 解题报告
- USACO 2.3.3 Zero Sum 解题报告
- USACO历年比赛的数据和解题报告
- USACO Postal Vans 解题报告
- usaco Calf Flac 解题报告
- USACO :Zero Sum解题报告
- USACO Stringsobits 解题报告
- Usaco 4.3.1 Buy Low, Buy Lower 详细解题报告
- USACO 4.3解题报告
- USACO Section 1.3 Mixing Milk 解题报告
- American Heritage USACO 3.4 (二叉树前序中序求后序)
- USACO Wormholes 解题报告
- USACO A Rectangular Barn 解题报告
- usaco Name That Number 解题报告
- 洛谷 P3106 [USACO14OPEN]GPS的决斗Dueling GPS's 解题报告
- USACO Home on the Range 解题报告
- 第四届吉林省大学生程序设计大赛个人解题报告 Problem B: The Farmer’s Heritage
- USACO 月赛 劣质的草 (重庆一中高2018级信息学竞赛测验2) 解题报告