码迷,mamicode.com
首页 > 其他好文 > 详细

hihoCoder hiho week 59 Performance Log

时间:2015-08-17 21:28:41      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

Description

You are given a txt file, which is performance logs of a single-threaded program. 

Each line has three columns as follow:

[Function Name] [TimeStamp] [Action]

[FunctionName] is a string of length between 1~255

[TimeStamp] format is hh:mm:ss

Valid values for "Action" column are START or END, marking the start or end of a function call. 

Each function will only be called once.

Output the depth-first traversal result of the call graph with the total time of each function call. However, sometimes the performance log isn‘t correct and at that time you just need to output "Incorrect performance log".

Input

The input only contains 1 case, first line is a positive number N representing the number of logs(1 <= N <= 20000), then there are N lines in next, each line is the log info containing [Function Name] [TimeStamp] [Action], [Function Name] is a string, you can assume the [Function Name] is distinct and the length between 1~255.

Output

Output the depth-first traversal result of the call graph with the total time of each function call for the correct performance, or output "Incorrect performance log".

提示

A call graph is a directed graph that represents calling relationships between subroutines in a computer program.

Call graph for the sample input is shown as below:

技术分享

Another sample test case.

 
Sample Input Sample Output
8
FuncA 00:00:01 START
FuncB 00:00:02 START
FuncC 00:00:03 START
FuncA 00:00:04 END
FuncB 00:00:05 END
FuncD 00:00:06 START
FuncD 00:00:07 END
FuncC 00:00:08 END
Incorrect performance log








Sample Input

8
FuncA 00:00:01 START
FuncB 00:00:02 START
FuncC 00:00:03 START
FuncC 00:00:04 END
FuncB 00:00:05 END
FuncD 00:00:06 START
FuncD 00:00:07 END
FuncA 00:00:08 END

Sample Output

FuncA 00:00:07
FuncB 00:00:03
FuncC 00:00:01
FuncD 00:00:01



Solution:

 1 #include <iostream>
 2 #include <vector>
 3 #include <stack>
 4 #include <deque>
 5 #include <cstdio>
 6 using namespace std;
 7 
 8 struct Func {
 9     string parent;
10     string name;
11     string timestamp;
12     string action;
13 };
14 
15 struct GraphNode {
16     string parent;
17     string name;
18     string timestamp;
19     deque<GraphNode*> children; 
20     GraphNode(string parent, string name, string timestamp) {
21         this->parent = parent;
22         this->name = name;
23         this->timestamp = timestamp;
24     }
25 };
26 
27 string computeTime(string ts, string te) {
28     int hs, he, ms, me, ss, se;
29 
30     sscanf(ts.c_str(), "%d:%d:%d", &hs, &ms, &ss);
31     sscanf(te.c_str(), "%d:%d:%d", &he, &me, &se);
32 
33     int secs = (he-hs)*3600 + (me-ms)*60 + se-ss;
34     if (secs < 0) return "";
35 
36     char buf[10];
37     sprintf(buf, "%02d:%02d:%02d", secs/3600, (secs%3600)/60, secs%60);
38 
39     return string(buf);
40 }
41 
42 void dfs(GraphNode *node) {
43     cout << node->name << " " << node->timestamp << endl;
44     for (int i = 0; i < node->children.size(); ++i) {
45         dfs(node->children[i]);
46     }
47 }
48 
49 int main() {
50     
51     ios_base::sync_with_stdio(false);
52     int N;
53     cin >> N;
54     stack<Func> S;
55     stack<GraphNode*> _S;
56     string par = "";
57     for (int i = 0; i < N; ++i) {
58         string name, timestamp, action;
59         cin >> name >> timestamp >> action;
60         Func f = (Func) {par, name, timestamp, action};
61         if (action == "START") {
62             S.push(f);
63             par = name;
64         }
65         else {
66             if (S.empty() || S.top().name != f.name || S.top().action != "START") {
67                 cout << "Incorrect performance log" << endl;
68                 return 0;
69             }
70             else {
71                 Func f1 = S.top();
72                 S.pop();
73                 par = S.empty() ? "" : S.top().name;
74                 string timelapse = computeTime(f1.timestamp, f.timestamp);
75                 if (timelapse.length() == 0) {
76                     cout << "Incorrect performance log" << endl;
77                     return 0;
78                 }
79                 GraphNode *node = new GraphNode(f1.parent, f1.name, timelapse);
80                 while (!_S.empty() && _S.top()->parent == f1.name) {
81                     GraphNode *ch = _S.top();
82                     _S.pop();
83                     node->children.push_front(ch);
84                 }
85                 _S.push(node);
86             }
87         }
88     }
89 
90     if (!S.empty() && _S.size() != 1) {
91         cout << "Incorrect performance log" << endl;
92         return 0;
93     }
94     GraphNode *root = _S.top();
95     dfs(root);
96 }

 

hihoCoder hiho week 59 Performance Log

标签:

原文地址:http://www.cnblogs.com/liew/p/4737602.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!