Submission #1543096


Source Code Expand

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <utility>
#include <algorithm>
#include <cstdlib>
#include <set>

using namespace std;

const int MAXN = 2000 + 10;

int N;
char A[MAXN], B[MAXN];
int ToMove[MAXN], nToMove;
int One[MAXN * 3], nOne;
int Left[MAXN], Right[MAXN];

int dist(int from, int to)
{
	from = (from % N + N) % N;
	to = (to % N + N) % N;
	return min(abs(from - to), N - abs(from - to));
}

void Work()
{
	scanf("%s%s", A, B);
	if (strcmp(A, B) == 0)
	{
		printf("0\n");
		return;
	}
	N = strlen(A);
	nOne = 0;
	for (int i = 0; i < N; i ++)
		if (B[i] == '1')
		{
			One[nOne * 3 + 0] = i - N;
			One[nOne * 3 + 1] = i;
			One[nOne * 3 + 2] = i + N;
			nOne ++;
		}
	sort(One, One + nOne * 3);
	if (nOne == 0)
	{
		printf("-1\n");
		return;
	}

	int ans = 1000000000;
	for (int start = 0; start < N; start ++)
	{
		int ops = 0;
		nToMove = 0;
		for (int i = 0; i < N; i ++)
			if (A[(start + i) % N] != B[i])
			{
				ops ++;
				if (B[i] == '0')
					ToMove[nToMove ++] = (start + i) % N;
			}
		if (nToMove == 0)
		{
			ops += min(start, N - start);
			ans = min(ans, ops);
			continue;
		}
		for (int k = 0; k < nToMove; k ++)
		{
			int i = ToMove[k];
			Left[k] = i - (*(upper_bound(One, One + nOne * 3, i) - 1));
			Right[k] = (*lower_bound(One, One + nOne * 3, i)) - i;
		}
		
		vector < pair <int, int> > V;
		multiset <int> Set;
		V.clear();
		Set.clear();
		for (int k = 0; k < nToMove; k ++)
		{
			V.push_back(make_pair(Left[k], Right[k]));
			Set.insert(-Right[k]);
		}
		sort(V.begin(), V.end());
		int ansmv = 1000000000, l, r, curmv;;

		l = 0;
		r = -*Set.begin();
		curmv = min(l + l + r + dist(-r, start), r + r + l + dist(l, start));
		ansmv = min(ansmv, curmv);

		for (int k = 0; k < nToMove; k ++)
		{
			Set.erase(Set.find(-V[k].second));
			l = V[k].first;
			r = Set.empty() ? 0 : (-*Set.begin());
			curmv = min(l + l + r + dist(-r, start), r + r + l + dist(l, start));
			ansmv = min(ansmv, curmv);
		}

		ans = min(ans, ansmv + ops);
	}

	printf("%d\n", ans);
}

int main()
{
	Work();
	return 0;
}

Submission Info

Submission Time
Task D - Shift and Flip
User TianXie
Language C++14 (GCC 5.4.1)
Score 1000
Code Size 2194 Byte
Status AC
Exec Time 712 ms
Memory 384 KB

Compile Error

./Main.cpp: In function ‘void Work()’:
./Main.cpp:29:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%s%s", A, B);
                     ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1000 / 1000
Status
AC × 4
AC × 54
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
All sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, subtask_1_01.txt, subtask_1_02.txt, subtask_1_03.txt, subtask_1_04.txt, subtask_1_05.txt, subtask_1_06.txt, subtask_1_07.txt, subtask_1_08.txt, subtask_1_09.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt, subtask_1_14.txt, subtask_1_15.txt, subtask_1_16.txt, subtask_1_17.txt, subtask_1_18.txt, subtask_1_19.txt, subtask_1_20.txt, subtask_1_21.txt, subtask_1_22.txt, subtask_1_23.txt, subtask_1_24.txt, subtask_1_25.txt, subtask_1_26.txt, subtask_1_27.txt, subtask_1_28.txt, subtask_1_29.txt, subtask_1_30.txt, subtask_1_31.txt, subtask_1_32.txt, subtask_1_33.txt, subtask_1_34.txt, subtask_1_35.txt, subtask_1_36.txt, subtask_1_37.txt, subtask_1_38.txt, subtask_1_39.txt, subtask_1_40.txt, subtask_1_41.txt, subtask_1_42.txt, subtask_1_43.txt, subtask_1_44.txt, subtask_1_45.txt, subtask_1_46.txt
Case Name Status Exec Time Memory
sample_01.txt AC 1 ms 256 KB
sample_02.txt AC 1 ms 256 KB
sample_03.txt AC 1 ms 256 KB
sample_04.txt AC 1 ms 256 KB
subtask_1_01.txt AC 1 ms 256 KB
subtask_1_02.txt AC 1 ms 256 KB
subtask_1_03.txt AC 1 ms 256 KB
subtask_1_04.txt AC 1 ms 256 KB
subtask_1_05.txt AC 14 ms 256 KB
subtask_1_06.txt AC 1 ms 256 KB
subtask_1_07.txt AC 1 ms 256 KB
subtask_1_08.txt AC 1 ms 256 KB
subtask_1_09.txt AC 1 ms 256 KB
subtask_1_10.txt AC 2 ms 256 KB
subtask_1_11.txt AC 332 ms 256 KB
subtask_1_12.txt AC 133 ms 256 KB
subtask_1_13.txt AC 335 ms 256 KB
subtask_1_14.txt AC 359 ms 384 KB
subtask_1_15.txt AC 439 ms 256 KB
subtask_1_16.txt AC 528 ms 384 KB
subtask_1_17.txt AC 527 ms 384 KB
subtask_1_18.txt AC 595 ms 384 KB
subtask_1_19.txt AC 629 ms 384 KB
subtask_1_20.txt AC 586 ms 256 KB
subtask_1_21.txt AC 332 ms 384 KB
subtask_1_22.txt AC 332 ms 256 KB
subtask_1_23.txt AC 710 ms 384 KB
subtask_1_24.txt AC 712 ms 384 KB
subtask_1_25.txt AC 711 ms 384 KB
subtask_1_26.txt AC 2 ms 256 KB
subtask_1_27.txt AC 3 ms 256 KB
subtask_1_28.txt AC 11 ms 256 KB
subtask_1_29.txt AC 56 ms 256 KB
subtask_1_30.txt AC 273 ms 256 KB
subtask_1_31.txt AC 1 ms 256 KB
subtask_1_32.txt AC 2 ms 256 KB
subtask_1_33.txt AC 4 ms 256 KB
subtask_1_34.txt AC 14 ms 256 KB
subtask_1_35.txt AC 69 ms 256 KB
subtask_1_36.txt AC 319 ms 256 KB
subtask_1_37.txt AC 2 ms 256 KB
subtask_1_38.txt AC 3 ms 256 KB
subtask_1_39.txt AC 17 ms 256 KB
subtask_1_40.txt AC 74 ms 256 KB
subtask_1_41.txt AC 296 ms 256 KB
subtask_1_42.txt AC 288 ms 256 KB
subtask_1_43.txt AC 326 ms 256 KB
subtask_1_44.txt AC 333 ms 256 KB
subtask_1_45.txt AC 327 ms 256 KB
subtask_1_46.txt AC 336 ms 256 KB