Submission #2612431


Source Code Expand

import static java.lang.Integer.parseInt;
import static java.lang.Long.parseLong;
import static java.lang.Math.max;
import static java.lang.System.exit;
import static java.util.Arrays.fill;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {

	static class Token implements Comparable<Token> {
		int index;
		final int time;

		Token(int index, int time) {
			this.index = index;
			this.time = time;
		}

		public int compareTo(Token o) {
			return time - o.time;
		}
	}

	static void solve() throws Exception {
		int c1 = scanInt();
		int c2 = scanInt();
		int c = max(c1, c2);
		int k = scanInt();
		int bit[] = new int[c];
		String s1 = scanString();
		for (int i = 0; i < c1; i++) {
			if (s1.charAt(i) == '1') {
				bit[c1 - i - 1] |= 1;
			}
		}
		String s2 = scanString();
		for (int i = 0; i < c2; i++) {
			if (s2.charAt(i) == '1') {
				bit[c2 - i - 1] |= 2;
			}
		}
		int lCap = 2 * c + 2;
		int lIndex[] = new int[lCap], lValue[] = new int[lCap];
		int lPrev[] = new int[lCap], lNext[] = new int[lCap], lFree = 1;
		Token lToken[] = new Token[lCap];
		for (int i = 1; i < lCap - 1; i++) {
			lNext[i] = i + 1;
		}
		lNext[lCap - 1] = -1;
		lPrev[0] = lNext[0] = 0;
		lIndex[0] = lValue[0] = -1;
		PriorityQueue<Token> pq = new PriorityQueue<>();
		for (int i = 0; i < c; i++) {
			if (bit[i] == 0) {
				continue;
			}
			int cur = lFree;
			lFree = lNext[lFree];
			lIndex[cur] = i;
			lValue[cur] = bit[i];
			int last = lPrev[0];
			if (lValue[last] == 3 && lValue[cur] != 3) {
				lToken[last] = new Token(last, lIndex[cur] - lIndex[last]);
				pq.add(lToken[last]);
			}
			lPrev[cur] = last;
			lNext[cur] = 0;
			lPrev[0] = lNext[last] = cur;
		}
		for (int step = 1; step <= k; step++) {
			while (!pq.isEmpty() && pq.element().time == step) {
				int cur = pq.remove().index;
				lToken[cur] = null;
				int v;
				{
					int next = lNext[cur];
					v = lValue[next];
					lValue[cur] = 3 ^ v;
					lIndex[cur] += step;
					int prev = lPrev[cur];
					if (lValue[prev] == 3) {
						lToken[prev] = new Token(prev, lIndex[cur] - lIndex[prev]);
						pq.add(lToken[prev]);
					}
					int next2 = lNext[next];
					lNext[cur] = next2;
					lPrev[next2] = cur;
					lNext[next] = lFree;
					lFree = next;
				}
				int curIndex = lIndex[cur];
				while (true) {
					int next = lNext[cur];
					++curIndex;
					if (lValue[next] != 3 && lIndex[next] == curIndex) {
						if (lValue[next] == v) {
							int next2 = lNext[next];
							lNext[cur] = next2;
							lPrev[next2] = cur;
							lNext[next] = lFree;
							lFree = next;
						} else {
							lValue[next] = 3;
							lIndex[next] -= step;
							int next2 = lNext[next];
							if (next2 != 0 && lValue[next2] != 3) {
								lToken[next] = new Token(next, lIndex[next2] - lIndex[next]);
								pq.add(lToken[next]);
							}
							break;
						}
					} else {
						int neww = lFree;
						lFree = lNext[lFree];
						lIndex[neww] = curIndex;
						lValue[neww] = v;
						lPrev[neww] = cur;
						lNext[neww] = next;
						lPrev[next] = lNext[cur] = neww;
						break;
					}
				}
			}
		}
		int last = lPrev[0];
		int maxIndex = lValue[last] == 3 ? lIndex[last] + k : lIndex[last];
		char bits0[] = new char[maxIndex + 1], bits1[] = new char[maxIndex + 1];
		fill(bits0, '0');
		fill(bits1, '0');
		int firstBit0 = -1, firstBit1 = -1;
		for (int cur = lNext[0]; cur != 0; cur = lNext[cur]) {
			int curValue = lValue[cur];
			int curIndex = curValue == 3 ? lIndex[cur] + k : lIndex[cur];
			if ((curValue & 1) != 0) {
				bits0[maxIndex - curIndex] = '1';
				firstBit0 = maxIndex - curIndex;
			}
			if ((curValue & 2) != 0) {
				bits1[maxIndex - curIndex] = '1';
				firstBit1 = maxIndex - curIndex;
			}
		}
		out.println(new String(bits0, firstBit0, maxIndex - firstBit0 + 1));
		out.print(new String(bits1, firstBit1, maxIndex - firstBit1 + 1));
	}

	static int scanInt() throws IOException {
		return parseInt(scanString());
	}

	static long scanLong() throws IOException {
		return parseLong(scanString());
	}

	static String scanString() throws IOException {
		while (tok == null || !tok.hasMoreTokens()) {
			tok = new StringTokenizer(in.readLine());
		}
		return tok.nextToken();
	}

	static BufferedReader in;
	static PrintWriter out;
	static StringTokenizer tok;

	public static void main(String[] args) {
		try {
			in = new BufferedReader(new InputStreamReader(System.in));
			out = new PrintWriter(System.out);
			solve();
			in.close();
			out.close();
		} catch (Throwable e) {
			e.printStackTrace();
			exit(1);
		}
	}
}

Submission Info

Submission Time
Task F - Addition and Andition
User eatmore
Language Java8 (OpenJDK 1.8.0)
Score 2400
Code Size 4869 Byte
Status AC
Exec Time 1077 ms
Memory 117840 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 2400 / 2400
Status
AC × 3
AC × 96
Set Name Test Cases
Sample sample01.txt, sample02.txt, sample03.txt
All sample01.txt, sample02.txt, sample03.txt, in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, in17.txt, in18.txt, in19.txt, in20.txt, in21.txt, in22.txt, in23.txt, in24.txt, in25.txt, in26.txt, in27.txt, in28.txt, in29.txt, in30.txt, in31.txt, in32.txt, in33.txt, in34.txt, in35.txt, in36.txt, in37.txt, in38.txt, in39.txt, in40.txt, in41.txt, in42.txt, in43.txt, in44.txt, in45.txt, in46.txt, in47.txt, in48.txt, in49.txt, in50.txt, in51.txt, in52.txt, in53.txt, in54.txt, in55.txt, in56.txt, in57.txt, in58.txt, in59.txt, in60.txt, in61.txt, in62.txt, in63.txt, in64.txt, in65.txt, in66.txt, in67.txt, in68.txt, in69.txt, in70.txt, in71.txt, in72.txt, in73.txt, in74.txt, in75.txt, in76.txt, in77.txt, in78.txt, in79.txt, in80.txt, in81.txt, in82.txt, in83.txt, in84.txt, in85.txt, in86.txt, in87.txt, in88.txt, in89.txt, in90.txt, sample01.txt, sample02.txt, sample03.txt
Case Name Status Exec Time Memory
in01.txt AC 657 ms 100528 KB
in02.txt AC 654 ms 106196 KB
in03.txt AC 667 ms 101236 KB
in04.txt AC 648 ms 101104 KB
in05.txt AC 773 ms 101940 KB
in06.txt AC 696 ms 103576 KB
in07.txt AC 695 ms 101728 KB
in08.txt AC 739 ms 100232 KB
in09.txt AC 678 ms 104364 KB
in10.txt AC 684 ms 102032 KB
in11.txt AC 667 ms 98524 KB
in12.txt AC 669 ms 103120 KB
in13.txt AC 661 ms 101248 KB
in14.txt AC 668 ms 101068 KB
in15.txt AC 667 ms 101012 KB
in16.txt AC 1005 ms 113476 KB
in17.txt AC 1034 ms 106068 KB
in18.txt AC 967 ms 107868 KB
in19.txt AC 962 ms 110072 KB
in20.txt AC 1018 ms 106404 KB
in21.txt AC 965 ms 107408 KB
in22.txt AC 967 ms 102148 KB
in23.txt AC 1036 ms 108840 KB
in24.txt AC 1022 ms 106768 KB
in25.txt AC 951 ms 107032 KB
in26.txt AC 1053 ms 117840 KB
in27.txt AC 1013 ms 111912 KB
in28.txt AC 1029 ms 108576 KB
in29.txt AC 966 ms 109212 KB
in30.txt AC 1077 ms 113888 KB
in31.txt AC 357 ms 86852 KB
in32.txt AC 371 ms 92544 KB
in33.txt AC 357 ms 85784 KB
in34.txt AC 351 ms 88744 KB
in35.txt AC 349 ms 91420 KB
in36.txt AC 356 ms 90148 KB
in37.txt AC 374 ms 87964 KB
in38.txt AC 368 ms 86440 KB
in39.txt AC 354 ms 83736 KB
in40.txt AC 357 ms 86820 KB
in41.txt AC 365 ms 90800 KB
in42.txt AC 374 ms 85356 KB
in43.txt AC 359 ms 89232 KB
in44.txt AC 354 ms 88924 KB
in45.txt AC 369 ms 91088 KB
in46.txt AC 651 ms 96900 KB
in47.txt AC 824 ms 98992 KB
in48.txt AC 633 ms 95196 KB
in49.txt AC 637 ms 101552 KB
in50.txt AC 763 ms 99644 KB
in51.txt AC 687 ms 99920 KB
in52.txt AC 735 ms 97604 KB
in53.txt AC 749 ms 95912 KB
in54.txt AC 736 ms 94604 KB
in55.txt AC 630 ms 93420 KB
in56.txt AC 683 ms 100288 KB
in57.txt AC 670 ms 100512 KB
in58.txt AC 796 ms 98184 KB
in59.txt AC 667 ms 95000 KB
in60.txt AC 683 ms 102668 KB
in61.txt AC 748 ms 97856 KB
in62.txt AC 699 ms 95320 KB
in63.txt AC 622 ms 97672 KB
in64.txt AC 755 ms 95760 KB
in65.txt AC 730 ms 96328 KB
in66.txt AC 715 ms 101132 KB
in67.txt AC 634 ms 93652 KB
in68.txt AC 712 ms 96016 KB
in69.txt AC 678 ms 96316 KB
in70.txt AC 696 ms 97604 KB
in71.txt AC 498 ms 94580 KB
in72.txt AC 501 ms 92412 KB
in73.txt AC 499 ms 93300 KB
in74.txt AC 515 ms 95300 KB
in75.txt AC 490 ms 96368 KB
in76.txt AC 506 ms 92952 KB
in77.txt AC 502 ms 94564 KB
in78.txt AC 476 ms 95648 KB
in79.txt AC 490 ms 92656 KB
in80.txt AC 483 ms 93732 KB
in81.txt AC 485 ms 90428 KB
in82.txt AC 483 ms 95368 KB
in83.txt AC 520 ms 90952 KB
in84.txt AC 501 ms 93028 KB
in85.txt AC 455 ms 96368 KB
in86.txt AC 485 ms 95208 KB
in87.txt AC 497 ms 92784 KB
in88.txt AC 498 ms 95084 KB
in89.txt AC 498 ms 92488 KB
in90.txt AC 485 ms 92604 KB
sample01.txt AC 73 ms 17748 KB
sample02.txt AC 74 ms 21076 KB
sample03.txt AC 74 ms 21332 KB