Submission #1794802


Source Code Expand

#include<bits/stdc++.h>

using namespace std;

using vi = vector< int >;
using vii = vector< vi >;

struct Bipartite_Matching
{
  vector< set< int > > graph;
  vector< int > match, alive, used;
  int timestamp;

  Bipartite_Matching(int n)
  {
    timestamp = 0;
    graph.resize(n);
    alive.assign(n, 1);
    used.assign(n, 0);
    match.assign(n, -1);
  }

/*
  void add_edge(int u, int v)
  {
    graph[u].push_back(v);
    graph[v].push_back(u);
  }
*/
  bool dfs(int v)
  {
    used[v] = timestamp;
    for(int u : graph[v]) {
      int w = match[u];
      if(alive[u] == 0) continue;
      if(w == -1 || (used[w] != timestamp && dfs(w))) {
        match[v] = u;
        match[u] = v;
        return (true);
      }
    }
    return (false);
  }

  int bipartite_matching()
  {
    int ret = 0;
    for(int i = 0; i < graph.size(); i++) {
      if(alive[i] == 0) continue;
      if(match[i] == -1) {
        ++timestamp;
        ret += dfs(i);
      }
    }
    return (ret);
  }
};


int main()
{
  int N;
  cin >> N;
  vector< vii > v(26, vii(N));
  for(int i = 0; i < N; i++) {
    string s;
    cin >> s;
    for(int j = 0; j < s.size(); j++) {
      v[s[j] - 'a'][i].push_back(j);
    }
  }

  for(int i = 0; i < 26; i++) {
    const int P = 100000;
    Bipartite_Matching flow(P + N);
    vector< int > ev[100000];
    for(int j = 0; j < N; j++) {
      for(int k : v[i][j]) {
        ev[k].emplace_back(j);
      }
    }
    int k = 0;
    int f = 0;
    for(int j = 0; j < P; j++) {
      while(k < P && k - j < N) {
        for(auto &addidx : ev[k]) {
          flow.graph[addidx + P].emplace(k);
          flow.graph[k].emplace(addidx + P);
          if(flow.match[k] == -1) {
            ++flow.timestamp;
            f += flow.dfs(k);
          }
          if(flow.match[addidx + P] == -1) {
            ++flow.timestamp;
            f += flow.dfs(addidx + P);
          }
        }
        ++k;
      }


      if(f == N) {
        cout << "YES" << endl;
        return (0);
      }

      for(auto &delidx : ev[j]) {
        bool update = false;
        if(flow.match[delidx + P] == j) {
          flow.match[delidx + P] = flow.match[j] = -1;
          flow.graph[delidx + P].erase(j);
          --f;
          update = true;
        }
        flow.graph[j].erase(delidx + P);
        flow.graph[delidx + P].erase(j);
        if(update) {
          ++flow.timestamp;
          f += flow.dfs(k);
          ++flow.timestamp;
          f += flow.dfs(delidx + P);
        }
      }
    }
  }

  cout << "NO" << endl;
}

Submission Info

Submission Time
Task B - コメント
User ei13333
Language C++14 (GCC 5.4.1)
Score 90
Code Size 2664 Byte
Status AC
Exec Time 520 ms
Memory 12092 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 60 / 60
Status
AC × 2
AC × 18
AC × 46
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
Subtask1 sample_01.txt, sample_02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt
Subtask2 sample_01.txt, sample_02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt, subtask2_13.txt, subtask2_14.txt, subtask2_15.txt, subtask2_16.txt, subtask2_17.txt, subtask2_18.txt, subtask2_19.txt, subtask2_20.txt, subtask2_21.txt, subtask2_22.txt, subtask2_23.txt, subtask2_24.txt, subtask2_25.txt, subtask2_26.txt, subtask2_27.txt, subtask2_28.txt
Case Name Status Exec Time Memory
sample_01.txt AC 9 ms 8472 KB
sample_02.txt AC 41 ms 8472 KB
subtask1_01.txt AC 41 ms 8472 KB
subtask1_02.txt AC 43 ms 8576 KB
subtask1_03.txt AC 42 ms 8596 KB
subtask1_04.txt AC 42 ms 8576 KB
subtask1_05.txt AC 32 ms 8724 KB
subtask1_06.txt AC 42 ms 8596 KB
subtask1_07.txt AC 6 ms 8576 KB
subtask1_08.txt AC 42 ms 8576 KB
subtask1_09.txt AC 5 ms 8576 KB
subtask1_10.txt AC 42 ms 8576 KB
subtask1_11.txt AC 42 ms 8596 KB
subtask1_12.txt AC 41 ms 8596 KB
subtask1_13.txt AC 16 ms 8576 KB
subtask1_14.txt AC 41 ms 8472 KB
subtask1_15.txt AC 17 ms 8472 KB
subtask1_16.txt AC 42 ms 8576 KB
subtask2_01.txt AC 18 ms 9216 KB
subtask2_02.txt AC 257 ms 9232 KB
subtask2_03.txt AC 130 ms 10384 KB
subtask2_04.txt AC 84 ms 9232 KB
subtask2_05.txt AC 34 ms 9728 KB
subtask2_06.txt AC 68 ms 12092 KB
subtask2_07.txt AC 14 ms 12024 KB
subtask2_08.txt AC 16 ms 9216 KB
subtask2_09.txt AC 256 ms 9232 KB
subtask2_10.txt AC 59 ms 8976 KB
subtask2_11.txt AC 229 ms 9232 KB
subtask2_12.txt AC 74 ms 9232 KB
subtask2_13.txt AC 25 ms 9232 KB
subtask2_14.txt AC 258 ms 9360 KB
subtask2_15.txt AC 44 ms 9232 KB
subtask2_16.txt AC 105 ms 9236 KB
subtask2_17.txt AC 75 ms 9108 KB
subtask2_18.txt AC 102 ms 9236 KB
subtask2_19.txt AC 89 ms 9216 KB
subtask2_20.txt AC 72 ms 9360 KB
subtask2_21.txt AC 70 ms 9344 KB
subtask2_22.txt AC 70 ms 9344 KB
subtask2_23.txt AC 41 ms 9360 KB
subtask2_24.txt AC 84 ms 9484 KB
subtask2_25.txt AC 69 ms 9344 KB
subtask2_26.txt AC 75 ms 9484 KB
subtask2_27.txt AC 520 ms 9484 KB
subtask2_28.txt AC 514 ms 9484 KB