Submission #65071503


Source Code Expand

#include <stdio.h>
#include <ctype.h>
#include <limits.h>

#define NUM (1 << CHAR_BIT)

int N;
char S[212345];
char T[212345];

int to[NUM];

int visited[NUM];
char is_loop[NUM];
char cost_canceled[NUM];

int main(void) {
	int i;
	int ans = 0;
	int loop_ok = 0, loop_exists = 0;
	if (scanf("%d", &N) != 1) return 1;
	if (scanf("%212344s", S) != 1) return 1;
	if (scanf("%212344s", T) != 1) return 1;
	for (i = 0; i < N; i++) {
		int f = (unsigned char)S[i], t = (unsigned char)T[i];
		if (to[f] != 0 && to[f] != t) {
			puts("-1");
			return 0;
		}
		to[f] = t;
	}
	/* 明らかにループ可能か (空き文字があるか) をチェックする */
	for (i = 1; i < NUM; i++) {
		if (islower(i) && to[i] == 0) {
			loop_ok = 1;
			break;
		}
	}
	/* ループをカウントする */
	for (i = 1; i < NUM; i++) {
		int cur = i;
		int steps = 0;
		while (to[cur] != 0 && to[cur] != cur) {
			if (visited[cur] == i) {
				/* ループである */
				loop_exists = 1;
				is_loop[i] = 1;
				ans++;
				break;
			} else if (visited[cur] != 0) {
				/* 調査済のところに着いた */
				int v = visited[cur];
				if (cur != i && is_loop[v] && !cost_canceled[v]) {
					cost_canceled[v] = 1;
					ans--;
				}
				break;
			}
			visited[cur] = i;
			cur = to[cur];
			steps++;
		}
		if (cur != i) {
			/* ループや行き止まりに至る前に、置換元の数字がある */
			loop_ok = 1;
			/* 今回ループで、スタート位置はループ外だった */
			if (is_loop[i]) {
				cost_canceled[i] = 1;
				ans--;
			}
		}
	}
	if (loop_exists && !loop_ok) {
		puts("-1");
		return 0;
	}
	/* 置換をカウントする */
	for (i = 1; i < NUM; i++) {
		ans += to[i] != 0 && to[i] != i;
	}
	printf("%d\n", ans);
	return 0;
}

/*

ある文字が複数種類の文字になる → 無理 (失格)
ループがある → 一旦使っていない文字に退避して処理する 使っていない文字がなければ失格

26
abcdefghijklmnopqrstuvwxyz
bacdefghijklmnopqrstuvwxxz

このとき、使われていない文字は無いが、まずyをxにするとyが空くので退避できる
よって、「使っていない文字がなければ失格」は嘘

26
abcdefghijklmnopqrstuvwxyz
bacdefghijklmnopqrstuvwxaz

b → y
a → b
y → a

の3回でいけるが、工夫しないと 4 が出てしまう

通常、ループがある場合は退避によりコストが1増えるが、
ループ外からループに入る文字がある場合、退避先をその文字にすることで、
「退避先からループに戻す」と「その文字を欲しい文字にする」を重ねることができ、
コストが相殺される

26
abcdefghijklmnopqrstuvwxyz
badcefghijklmnopqrstuvwxaz

b → y
c → b
d → c
b → d
a → b
y → a

26
abcdefghijklmnopqrstuvwxyz
bcbdefghijklmnopqrstuvwxyz

c → a
b → c
a → b

ループにおけるコストの相殺判定が、1セットでループ外からループに入ると、行われない

*/

Submission Info

Submission Time
Task E - Replace
User mikecat
Language C (gcc 12.2.0)
Score 500
Code Size 3114 Byte
Status AC
Exec Time 2 ms
Memory 2120 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 4
AC × 87
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 02_random2_00.txt, 02_random2_01.txt, 02_random2_02.txt, 02_random2_03.txt, 02_random2_04.txt, 02_random2_05.txt, 02_random2_06.txt, 02_random2_07.txt, 02_random2_08.txt, 02_random2_09.txt, 02_random2_10.txt, 02_random2_11.txt, 02_random2_12.txt, 02_random2_13.txt, 02_random2_14.txt, 02_random2_15.txt, 02_random2_16.txt, 02_random2_17.txt, 02_random2_18.txt, 02_random2_19.txt, 02_random2_20.txt, 02_random2_21.txt, 02_random2_22.txt, 02_random2_23.txt, 02_random2_24.txt, 02_random2_25.txt, 02_random2_26.txt, 02_random2_27.txt, 02_random2_28.txt, 02_random2_29.txt, 02_random2_30.txt, 02_random2_31.txt, 02_random2_32.txt, 02_random2_33.txt, 02_random2_34.txt, 02_random2_35.txt, 02_random2_36.txt, 02_random2_37.txt, 02_random2_38.txt, 02_random2_39.txt, 02_random2_40.txt, 02_random2_41.txt, 02_random2_42.txt, 02_random2_43.txt, 02_random2_44.txt, 02_random2_45.txt, 02_random2_46.txt, 02_random2_47.txt, 02_random2_48.txt, 02_random2_49.txt, 02_random2_50.txt, 02_random2_51.txt, 02_random2_52.txt, 02_random2_53.txt, 02_random2_54.txt, 02_random2_55.txt, 02_random2_56.txt, 02_random2_57.txt, 02_random2_58.txt, 02_random2_59.txt, 02_random2_60.txt, 02_random2_61.txt, 02_random2_62.txt, 02_random2_63.txt, 02_random2_64.txt, 02_random2_65.txt, 03_random3_00.txt, 03_random3_01.txt, 03_random3_02.txt, 04_handmade_00.txt, 04_handmade_01.txt, 04_handmade_02.txt, 04_handmade_03.txt, 04_handmade_04.txt, 04_handmade_05.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 1620 KiB
00_sample_01.txt AC 1 ms 1720 KiB
00_sample_02.txt AC 0 ms 1556 KiB
00_sample_03.txt AC 0 ms 1620 KiB
01_random_00.txt AC 1 ms 1708 KiB
01_random_01.txt AC 1 ms 1640 KiB
01_random_02.txt AC 1 ms 1936 KiB
01_random_03.txt AC 1 ms 1696 KiB
01_random_04.txt AC 1 ms 1732 KiB
01_random_05.txt AC 1 ms 1744 KiB
01_random_06.txt AC 2 ms 1932 KiB
01_random_07.txt AC 1 ms 1940 KiB
02_random2_00.txt AC 1 ms 2028 KiB
02_random2_01.txt AC 1 ms 2020 KiB
02_random2_02.txt AC 1 ms 1948 KiB
02_random2_03.txt AC 1 ms 1948 KiB
02_random2_04.txt AC 1 ms 1920 KiB
02_random2_05.txt AC 1 ms 2008 KiB
02_random2_06.txt AC 1 ms 2088 KiB
02_random2_07.txt AC 1 ms 2016 KiB
02_random2_08.txt AC 1 ms 2112 KiB
02_random2_09.txt AC 1 ms 2020 KiB
02_random2_10.txt AC 1 ms 1984 KiB
02_random2_11.txt AC 1 ms 1984 KiB
02_random2_12.txt AC 1 ms 2108 KiB
02_random2_13.txt AC 2 ms 1984 KiB
02_random2_14.txt AC 1 ms 1948 KiB
02_random2_15.txt AC 2 ms 2096 KiB
02_random2_16.txt AC 1 ms 2012 KiB
02_random2_17.txt AC 1 ms 1984 KiB
02_random2_18.txt AC 1 ms 2116 KiB
02_random2_19.txt AC 1 ms 2116 KiB
02_random2_20.txt AC 1 ms 2016 KiB
02_random2_21.txt AC 1 ms 2108 KiB
02_random2_22.txt AC 1 ms 1940 KiB
02_random2_23.txt AC 2 ms 2104 KiB
02_random2_24.txt AC 2 ms 2116 KiB
02_random2_25.txt AC 1 ms 1940 KiB
02_random2_26.txt AC 2 ms 2012 KiB
02_random2_27.txt AC 1 ms 2060 KiB
02_random2_28.txt AC 1 ms 2008 KiB
02_random2_29.txt AC 1 ms 2112 KiB
02_random2_30.txt AC 1 ms 2012 KiB
02_random2_31.txt AC 1 ms 2008 KiB
02_random2_32.txt AC 1 ms 2012 KiB
02_random2_33.txt AC 2 ms 2108 KiB
02_random2_34.txt AC 1 ms 2104 KiB
02_random2_35.txt AC 1 ms 2068 KiB
02_random2_36.txt AC 1 ms 2032 KiB
02_random2_37.txt AC 2 ms 1984 KiB
02_random2_38.txt AC 2 ms 2060 KiB
02_random2_39.txt AC 1 ms 2092 KiB
02_random2_40.txt AC 1 ms 1940 KiB
02_random2_41.txt AC 2 ms 2116 KiB
02_random2_42.txt AC 1 ms 2032 KiB
02_random2_43.txt AC 1 ms 2120 KiB
02_random2_44.txt AC 1 ms 2008 KiB
02_random2_45.txt AC 1 ms 2012 KiB
02_random2_46.txt AC 1 ms 2108 KiB
02_random2_47.txt AC 1 ms 1944 KiB
02_random2_48.txt AC 2 ms 2092 KiB
02_random2_49.txt AC 2 ms 2092 KiB
02_random2_50.txt AC 1 ms 1984 KiB
02_random2_51.txt AC 2 ms 2072 KiB
02_random2_52.txt AC 1 ms 1936 KiB
02_random2_53.txt AC 1 ms 2116 KiB
02_random2_54.txt AC 1 ms 1952 KiB
02_random2_55.txt AC 1 ms 2116 KiB
02_random2_56.txt AC 1 ms 2108 KiB
02_random2_57.txt AC 1 ms 2116 KiB
02_random2_58.txt AC 2 ms 2092 KiB
02_random2_59.txt AC 1 ms 1940 KiB
02_random2_60.txt AC 2 ms 1948 KiB
02_random2_61.txt AC 2 ms 2100 KiB
02_random2_62.txt AC 1 ms 2032 KiB
02_random2_63.txt AC 1 ms 2108 KiB
02_random2_64.txt AC 1 ms 1984 KiB
02_random2_65.txt AC 1 ms 2104 KiB
03_random3_00.txt AC 2 ms 2072 KiB
03_random3_01.txt AC 2 ms 2004 KiB
03_random3_02.txt AC 2 ms 2012 KiB
04_handmade_00.txt AC 1 ms 1940 KiB
04_handmade_01.txt AC 1 ms 1676 KiB
04_handmade_02.txt AC 1 ms 1620 KiB
04_handmade_03.txt AC 2 ms 2064 KiB
04_handmade_04.txt AC 1 ms 1984 KiB
04_handmade_05.txt AC 2 ms 1952 KiB