hihocoder #1057

程序要满足

1、不能交叉,即一个程序要么完全包含在另一程序时间里面,要么互不相交

2、时间严格递增


#include<iostream>  
#include<map>
#include<string.h>   
#include<algorithm>  
#include<fstream>
#include<cmath>  
#include<vector>
#include<stack>
#include<map>
#include<math.h>
using namespace std;  
#define lch(i) ((i)<<1)  
#define rch(i) ((i)<<1|1)  
#define sqr(i) ((i)*(i))  
#define pii pair<int,int>  
#define mp make_pair  
#define FOR(i,b,e) for(int i=b;i<=e;i++)  
#define FORE(i,b,e) for(int i=b;i>=e;i--)  
#define ms(a)   memset(a,0,sizeof(a))  
const int maxnum =20009;
const  int  mod = 10007;
int n,m;

class Tstamp
{
public:
	int h,min,sec;
	Tstamp(){}
	Tstamp(int a,int b,int c):h(a),min(b),sec(c){}
	Tstamp(char a[9]){
		h=(a[0]-'0')*10+(a[1]-'0');
		min=(a[3]-'0')*10+(a[4]-'0');
		sec=(a[6]-'0')*10+(a[7]-'0');
	}
	void operator=(const Tstamp& a){
		h=a.h;
		min=a.min;
		sec=a.sec;
	}
	Tstamp& operator-=(const Tstamp& b){
		if(sec<b.sec){
			min-=1;
			sec+=60;
		}
		sec-=b.sec;
		if(min<b.min){
			h-=1;
			min+=60;
		}
		min-=b.min;
		h-=b.h;
		return *this;
	}
};

Tstamp operator-(Tstamp& a, Tstamp& b){
	return a-=b;
}

struct node
{
	char name[256];
	Tstamp st,exi;
	node(){}
	node(char t[9]):st(t){}
}pro[maxnum];

node *pos,*root;
map<string,node*> p2node;
stack<string>  stamp;





int main()    
{  
#ifdef _DEBUG_
	fstream fin("G:/1.txt");
#else
#define fin cin
#endif
	fin>>n;
	char name[256],timestamp[9],action[6];
	bool flag=0;
	int last = 0,now;
	root = new node;
	pos=root;
	int pronum=0;
	FOR(i,1,n){
		fin>>name>>timestamp>>action;
		if(flag)continue;
		now=((timestamp[0]-'0')*10+(timestamp[1]-'0'))*3600+((timestamp[3]-'0')*10+(timestamp[4]-'0'))*60+(timestamp[6]-'0')*10+(timestamp[7]-'0');		
		if(now<last){
			flag=1;
			continue;
		}
		last=now;
		if(action[0]=='S'){
			if(p2node[name]!=0){
				flag=1;
				continue;
			}
			pro[++pronum].st=timestamp;
			strcpy(pro[pronum].name,name);
			stamp.push(name);
			p2node[name]=&pro[pronum];
		}
		if(action[0]=='E'){
			if(stamp.empty()){
				flag=1;
				continue;
			}
			string last= stamp.top();
			stamp.pop();
			if(strcmp(last.c_str(),name)!=0){
				flag=1;
				continue;
			}
			p2node[last]->exi=Tstamp(timestamp)-p2node[last]->st;
		}
	}
	if(!stamp.empty()||flag)
		printf("Incorrect performance log\n");
	else{
		FOR(i,1,pronum){
			printf("%s %02d:%02d:%02d\n",pro[i].name,pro[i].exi.h,pro[i].exi.min,pro[i].exi.sec);
		}
	}
	return 0;  
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值