This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define pii pair<int, int>
using namespace std;
const int MAX = 100007;
pair<string, string> E[MAX];
int F[MAX], V[MAX], in[MAX], S[MAX];
vector<int> G[MAX];
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int N;
cin >> N;
if (N & 1) {
cout << -1;
return 0;
}
map<string, int> SN;
for (int i = 1; i <= N; ++i) {
string a, b;
cin >> a >> b;
SN[a] = i;
E[i] = {a, b};
}
for (int i = 1; i <= N; ++i) F[SN[E[i].first]] = SN[E[i].second];
int RN = 0, match = 0;
for (int i = 1; i <= N; ++i) {
if (i != F[i] && F[F[i]] == i) V[i] = 1;
else RN++;
}
for (int i = 1; i <= N; ++i) {
if (V[i] || V[F[i]]) continue;
G[i].push_back(F[i]);
in[F[i]]++;
}
queue<int> Q;
for (int i = 1; i <= N; ++i) if (!G[i].empty() && !in[i]) Q.push(i);
while (!Q.empty()) {
int cur = Q.front(); Q.pop();
if (V[F[cur]]) continue;
if (!S[cur] && !S[F[cur]]) {
match++;
S[cur] = S[F[cur]] = 1;
}
if (!--in[F[cur]]) Q.push(F[cur]);
}
for (int i = 1; i <= N; ++i) {
if (!in[i]) continue;
int cur = i;
vector<int> C = {S[cur]};
while (1) {
cur = F[cur];
in[cur]--;
if (cur == i) break;
C.push_back(S[cur]);
}
bool one = (*max_element(C.begin(), C.end()) == 1);
if (!one) match += C.size() / 2;
else {
int piv = max_element(C.begin(), C.end()) - C.begin();
for (int i = 0; i < C.size(); ++i) {
int a = (piv + i) % C.size(), b = (piv + i + 1) % C.size();
if (!C[a] && !C[b]) {
match++;
C[a] = C[b] = 1;
}
}
}
}
int ans = RN - match;
cout << ans;
return 0;
}
Compilation message (stderr)
polygon.cpp: In function 'int main()':
polygon.cpp:68:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
68 | for (int i = 0; i < C.size(); ++i) {
| ~~^~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |