about summary refs log tree commit diff
path: root/codechef/binadd.c
diff options
context:
space:
mode:
authorNguyễn Gia Phong <vn.mcsinyx@gmail.com>2019-12-16 21:13:07 +0700
committerNguyễn Gia Phong <vn.mcsinyx@gmail.com>2019-12-16 21:13:07 +0700
commitc1008fe39217be7f91f0ea23483e747bfbc5743e (patch)
treec4f921bccd9e8d66e3aadd9a01ede3300d73afa6 /codechef/binadd.c
parent8a9d6282fcb863c67d6623f5c883ef703721cccd (diff)
downloadcp-c1008fe39217be7f91f0ea23483e747bfbc5743e.tar.gz
The good, the bad and the ugly
Diffstat (limited to 'codechef/binadd.c')
-rw-r--r--codechef/binadd.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/codechef/binadd.c b/codechef/binadd.c
new file mode 100644
index 0000000..8a2f56f
--- /dev/null
+++ b/codechef/binadd.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define SIZE (100001 * sizeof(int))
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
+int main()
+{
+	size_t t;
+	int *a = malloc(SIZE), *b = malloc(SIZE), c;
+	*a = *b = 0;
+	scanf("%zu", &t);
+
+	while (t--) {
+		size_t lena = 1, lenb = 1;
+		for (scanf(" "); (c = getchar()) > 42; a[lena++] = c - 48);
+		for (scanf(" "); (c = getchar()) > 42; b[lenb++] = c - 48);
+
+		size_t len = (lena > lenb) ? lena : lenb;
+		for (int *n = a + len, *e = a + lena, *p = b + lenb;
+		     n-- > a; *n = (e-- > a && *e) << 1 | (p-- > b && *p));
+
+		int tmp = 0;
+		size_t result = 0, sum = 0;
+		for (int *n = a + len; n-- > a;)
+			switch (*n | tmp) {
+			case 1:
+				result = MAX(result, 1);
+				break;
+			case 3:
+				tmp = 4;
+				break;
+			case 4:
+				result = MAX(result, sum + 2);
+				sum = tmp = 0;
+				break;
+			case 5:
+			case 6:
+				sum++;
+				break;
+			case 7:
+				if (n[1] < 3) {
+					result = MAX(result, sum + 2);
+					sum = 0;
+				}
+			}
+		printf("%zu\n", result);
+	}
+
+	return 0;
+}