Submission #66167424


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
constexpr int MAXN = 1'000'007;
constexpr int INF = 2'000'000'000;
constexpr ll INFF = 1'000'000'000'000'000'000LL;
constexpr ll MOD = 998'244'353;
#define mkp make_pair
#define F first
#define S second
#define pb emplace_back
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()

struct DSU {
  int n;
  vector<int> sz, p;

  void init(int _n) {
    n = _n;
    sz.resize(n + 1);
    p.resize(n + 1);
    for (int i = 0; i <= n; i++) {
      p[i] = i;
      sz[i] = 1;
    }
  }

  int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); }

  void merge(int x, int y) {
    x = find(x), y = find(y);
    if (x == y)
      return;
    if (sz[x] > sz[y])
      swap(x, y);
    sz[y] += sz[x];
    p[x] = y;
  }
} dsu;

int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  vector<vector<int>> G(n);

  for (int i = 0; i < n - 1; i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    G[u].pb(v);
    G[v].pb(u);
  }
  vector<string> a(n);
  for (auto &i : a)
    cin >> i;

  vector<string> merged(n, string(n, '0'));
  vector<vector<pii>> next_path(n, vector<pii>(n));
  //   map<pii, pii> next_path;
  vector<vector<int>> len(n, vector<int>(n, 0));
  //   map<pii, int> len;
  vector<pii> ps;
  vector<int> v;
  function<void(int, int)> dfs = [&](int now, int p) {
    int x = (sz(v) ? v[0] : now), y = now;
    len[x][y] = sz(v);
    if (sz(v) > 2)
      next_path[x][y] = mkp(v[1], v.back());
    else
      next_path[x][y] = mkp(-1, -1);
    ps.pb(x, y);
    v.pb(now);

    for (int i : G[now]) {
      if (i != p) {
        dfs(i, now);
      }
    }
    v.pop_back();
  };
  for (int i = 0; i < n; i++)
    dfs(i, -1);

  dsu.init(n);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      if (a[i][j] != '1')
        continue;
      int x = i, y = j;
      while (x >= 0 && y >= 0 && x != y) {
        if (merged[x][y] == '1')
          break;
        dsu.merge(x, y);
        auto [xx, yy] = next_path[x][y];
        merged[x][y] = '1';
        x = xx, y = yy;
      }
    }

  vector<int> color(n);
  for (int i = 0; i < n; i++)
    color[i] = dsu.find(i);
  sort(all(ps), [&](pii x, pii y) { return len[x.F][x.S] < len[y.F][y.S]; });
  merged = vector<string>(n, string(n, '0'));

  int ans = 0;
  for (auto [x, y] : ps) {
    if (x == y) {
      merged[x][y] = '1';
      ans++;
    } else {
      auto [xx, yy] = next_path[x][y];
      if ((xx == -1 || merged[xx][yy] == '1') && color[x] == color[y]) {
        merged[x][y] = '1';
        ans++;
      }
    }
  }
  cout << ans << '\n';
}
/*
- How to come up with solutions? (https://hackmd.io/-3cIVAFSQMC3iJTh9EpszA)
  - Play with some small examples.
  - Make observations (or random guesses) by intuition.
    - Try to find counterexamples of the "observations."
  - Find the characteristics of an optimal solution.
  - Try to solve simple cases.
  - Brute force and print out the results.
  - Pick a method (greedy, dp, d&c, ...)
    - But DO NOT force algos on problems!
  - IF YOU'RE STUCK, TRY SOMETHING ELSE! Make new observations!

- Before writing the solution:
  - check TL/ML/correctness of samples/implementation details!

- Pre-submit:
  - Did you make a typo when copying a template?
  - Test more cases if unsure.
    - Write a naive solution and check small cases.
  - Submit the correct file.

- Debugging:
  - General Debugging:
    - Read the whole problem again.
    - Think over the algorithm again.
    - Go to the toilet.

  - Wrong Answer:
    - Any possible overflows?
      - > `__int128` ?
      - Try `-ftrapv` or `#pragma GCC optimize("trapv")`
    - Floating point errors?
      - > `long double` ?
      - turn off math optimizations
      - check for `==`, `>=`, `acos(1.000000001)`, etc.
    - Did you forget to sort or unique?
    - Generate large and worst "corner" cases.
    - Check your `m` / `n`, `i` / `j`,  `x` / `y` and `<` / `>`.
    - Are everything initialized or reset properly?
    - Are you sure about the STL thing you are using?
      - Read cppreference.
    - Print everything and run it on pen and paper.

  - Time Limit Exceeded:
    - Calculate your time complexity again.
    - Does the program actually end?
      - Check for `while(q.size())` etc.
    - Test the largest cases locally.
    - Did you do unnecessary stuff?
      - e.g. pass vectors by value
      - e.g. `memset` for every test case
    - Is your constant factor reasonable?

  - Runtime Error:
    - Check memory usage.
      - Forget to clear or destroy stuff?
      - > `vector::shrink_to_fit()`
    - Stack overflow?
    - Bad pointer / array access?
      - Try `-fsanitize=address`
    - Division by zero? NaN's?
*/

Submission Info

Submission Time
Task D - Many Palindromes on Tree
User henotrix
Language C++ 20 (gcc 12.2)
Score 700
Code Size 4958 Byte
Status AC
Exec Time 2593 ms
Memory 259340 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 700 / 700
Status
AC × 3
AC × 85
Set Name Test Cases
Sample example_00.txt, example_01.txt, example_02.txt
All example_00.txt, example_01.txt, example_02.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt, test_51.txt, test_52.txt, test_53.txt, test_54.txt, test_55.txt, test_56.txt, test_57.txt, test_58.txt, test_59.txt, test_60.txt, test_61.txt, test_62.txt, test_63.txt, test_64.txt, test_65.txt, test_66.txt, test_67.txt, test_68.txt, test_69.txt, test_70.txt, test_71.txt, test_72.txt, test_73.txt, test_74.txt, test_75.txt, test_76.txt, test_77.txt, test_78.txt, test_79.txt, test_80.txt, test_81.txt
Case Name Status Exec Time Memory
example_00.txt AC 1 ms 3484 KiB
example_01.txt AC 1 ms 3480 KiB
example_02.txt AC 1 ms 3396 KiB
test_00.txt AC 1 ms 3488 KiB
test_01.txt AC 871 ms 163648 KiB
test_02.txt AC 180 ms 47960 KiB
test_03.txt AC 2 ms 3628 KiB
test_04.txt AC 136 ms 39640 KiB
test_05.txt AC 1231 ms 254980 KiB
test_06.txt AC 1284 ms 258900 KiB
test_07.txt AC 1251 ms 258936 KiB
test_08.txt AC 1243 ms 258916 KiB
test_09.txt AC 1295 ms 258940 KiB
test_10.txt AC 1263 ms 259040 KiB
test_11.txt AC 1226 ms 258920 KiB
test_12.txt AC 1195 ms 259044 KiB
test_13.txt AC 1239 ms 258984 KiB
test_14.txt AC 1213 ms 258920 KiB
test_15.txt AC 1186 ms 258964 KiB
test_16.txt AC 1553 ms 259116 KiB
test_17.txt AC 1570 ms 259196 KiB
test_18.txt AC 1543 ms 259256 KiB
test_19.txt AC 1545 ms 259272 KiB
test_20.txt AC 1537 ms 259212 KiB
test_21.txt AC 1528 ms 259340 KiB
test_22.txt AC 1570 ms 259260 KiB
test_23.txt AC 1593 ms 259192 KiB
test_24.txt AC 1567 ms 259252 KiB
test_25.txt AC 1555 ms 259260 KiB
test_26.txt AC 1462 ms 259084 KiB
test_27.txt AC 1498 ms 259040 KiB
test_28.txt AC 1452 ms 259064 KiB
test_29.txt AC 1438 ms 259040 KiB
test_30.txt AC 1458 ms 259084 KiB
test_31.txt AC 544 ms 258888 KiB
test_32.txt AC 546 ms 258920 KiB
test_33.txt AC 561 ms 258980 KiB
test_34.txt AC 687 ms 258988 KiB
test_35.txt AC 658 ms 259040 KiB
test_36.txt AC 672 ms 258908 KiB
test_37.txt AC 1303 ms 258964 KiB
test_38.txt AC 1321 ms 258956 KiB
test_39.txt AC 1340 ms 258912 KiB
test_40.txt AC 1332 ms 259048 KiB
test_41.txt AC 1287 ms 258936 KiB
test_42.txt AC 2466 ms 259288 KiB
test_43.txt AC 2403 ms 259120 KiB
test_44.txt AC 1631 ms 259100 KiB
test_45.txt AC 1580 ms 259044 KiB
test_46.txt AC 1598 ms 259060 KiB
test_47.txt AC 579 ms 258940 KiB
test_48.txt AC 577 ms 258968 KiB
test_49.txt AC 715 ms 259000 KiB
test_50.txt AC 738 ms 259000 KiB
test_51.txt AC 1321 ms 258936 KiB
test_52.txt AC 1299 ms 258924 KiB
test_53.txt AC 1329 ms 258876 KiB
test_54.txt AC 2416 ms 259228 KiB
test_55.txt AC 2510 ms 259264 KiB
test_56.txt AC 1664 ms 259032 KiB
test_57.txt AC 1698 ms 259048 KiB
test_58.txt AC 589 ms 258992 KiB
test_59.txt AC 589 ms 258944 KiB
test_60.txt AC 745 ms 258976 KiB
test_61.txt AC 742 ms 258992 KiB
test_62.txt AC 1271 ms 258812 KiB
test_63.txt AC 1268 ms 258964 KiB
test_64.txt AC 1258 ms 258916 KiB
test_65.txt AC 1657 ms 259280 KiB
test_66.txt AC 1631 ms 259260 KiB
test_67.txt AC 1588 ms 259228 KiB
test_68.txt AC 1364 ms 258928 KiB
test_69.txt AC 1335 ms 258956 KiB
test_70.txt AC 1345 ms 259044 KiB
test_71.txt AC 1343 ms 258848 KiB
test_72.txt AC 1330 ms 258988 KiB
test_73.txt AC 1715 ms 259084 KiB
test_74.txt AC 1681 ms 259028 KiB
test_75.txt AC 1699 ms 259092 KiB
test_76.txt AC 2476 ms 259280 KiB
test_77.txt AC 2593 ms 259124 KiB
test_78.txt AC 2567 ms 259336 KiB
test_79.txt AC 1585 ms 259260 KiB
test_80.txt AC 1592 ms 259264 KiB
test_81.txt AC 1582 ms 259264 KiB