Codeforces Round #387 (Div. 2), problem: (E) Comments Solution in C/C++

Codeforces Round #387 (Div. 2), problem: (E) Comments Solution in C/C++

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N	1000000

int ccnt;

struct comment {
	char *s;
	int d, i;
} cc[N];

char *ss[N];

int parse(int d, int i) {
	int k = atoi(ss[i + 1]);

	cc[ccnt].s = strdup(ss[i]);
	cc[ccnt].d = d;
	cc[ccnt++].i = i;
	i += 2;
	while (k-- > 0)
		i = parse(d + 1, i);
	return i;
}

int compare(const void *a, const void *b) {
	struct comment *pa = (struct comment *) a;
	struct comment *pb = (struct comment *) b;

	return pa->d != pb->d ? pa->d - pb->d : pa->i - pb->i;
}

int main() {
	int k_, k, i, j, m;
	static char s[N + 1], *t;

	scanf("%s", s);
	t = strtok(s, ",");
	for (k_ = 0; t != NULL; ss[k_++] = strdup(t), t = strtok(NULL, ","))
		;
	k = k_ / 2;
	ccnt = 0;
	for (i = 0; i < k_; i = parse(0, i))
		;
	qsort(cc, k, sizeof(*cc), compare);
	m = cc[k - 1].d + 1;
	printf("%d\n", m);
	for (i = 0, j = 0; i < m; i++) {
		while (j < k && cc[j].d == i) {
			printf("%s ", cc[j].s);
			j++;
		}
		printf("\n");
	}
	return 0;
}

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *