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 |
|
|
| 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 |