From e9144f112400428e489d901962ddf6b452747815 Mon Sep 17 00:00:00 2001 From: TooYoungTooSimp <6648049+TooYoungTooSimp@users.noreply.github.com> Date: Sun, 4 Aug 2019 14:55:59 +0800 Subject: [PATCH] Sun, 04 Aug 2019 14:55:59 +0800 --- nowcoder886/G.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/nowcoder886/G.cpp b/nowcoder886/G.cpp index 8ec9a26..eda14c4 100644 --- a/nowcoder886/G.cpp +++ b/nowcoder886/G.cpp @@ -9,7 +9,80 @@ using namespace std; #define NE1(x) FIL(x, -1) #define INF(x) FIL(x, 0x3f) typedef long long ll, i64; +const int N = 1e5 + 50; +char buf[12]; +int a[N][12]; +int mp[10]; +int dayOfWeek[10000][13][32]; +const int monthDay[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; +bool check(int i) +{ + auto p = a[i]; + int y = mp[p[0]] * 1000 + mp[p[1]] * 100 + mp[p[2]] * 10 + mp[p[3]]; + int m = mp[p[4]] * 10 + mp[p[5]]; + int d = mp[p[6]] * 10 + mp[p[7]]; + return y >= 1600 && m <= 12 && d <= 31 && dayOfWeek[y][m][d] == 5; +} +inline unsigned long long hs(char *s) +{ + unsigned long long r = 1; + while (*s) r = r * 131 + *s++; + return r; +} int main() { + mt19937_64 mt(time(0)); + for (int y = 1600, n = 6; y < 10000; y++) + for (int m = 1; m <= 12; m++) + { + int dayNum = monthDay[m] + ((m == 2) && (y % 400 == 0 || (y % 100 != 0 && y % 4 == 0))); + for (int d = 1; d <= dayNum; ++d) + { + dayOfWeek[y][m][d] = n++; + if (n >= 7) n -= 7; + } + } + int T, n; + scanf("%d", &T); + set S; + for (int t = 1; t <= T; t++) + { + S.clear(); + scanf("%d", &n); + int cnt = 0; + for (int i = 0; i < n; i++) + { + scanf("%s", buf); + auto h = hs(buf); + if (S.count(h)) continue; + S.insert(h); + auto p = a[cnt++]; + p[0] = buf[0] - 'A'; + p[1] = buf[1] - 'A'; + p[2] = buf[2] - 'A'; + p[3] = buf[3] - 'A'; + p[4] = buf[5] - 'A'; + p[5] = buf[6] - 'A'; + p[6] = buf[8] - 'A'; + p[7] = buf[9] - 'A'; + } + n = cnt; + for (int i = 0; i < 10; i++) mp[i] = i; + bool flag = true; + do + { + flag = true; + for (int i = 0; i < 10 && flag; i++) + flag &= check(mt() % n); + for (int i = 0; i < n && flag; i++) + flag &= check(i); + if (flag) break; + } while (next_permutation(mp, mp + 10)); + if (flag) + for (int i = buf[10] = 0; i < 10; i++) buf[i] = mp[i] + '0'; + else + strcpy(buf, "Impossible"); + printf("Case #%d: %s\n", t, buf); + } return 0; } \ No newline at end of file