Hướng dẫn giải của Cặp số bạn bè
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.
Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.
Tác giả:
Bước 1: Biểu diễn số đã cho bằng bitmask
- Mỗi số sẽ được biểu diễn bằng một bitmask -bit (tương ứng với các chữ số đến ).
Ví dụ:
- Số .
- Số .
Lưu ý: Có tối đa bitmask khác nhau.
Bước 2: Đếm số lượng mỗi bitmask
- Ta tạo mảng , với là số lượng số có .
Bước 3: Đếm số cặp hợp lệ
Có hai loại cặp:
1. Cặp có cùng mask
Chọn trong số số: .
2. Cặp khác mask
- Nếu
mask1 & mask1 != 0thì có chữ số trùng.
Với , cộng nếu i & j != 0.
Độ phức tạp
- Duyệt số để tính mask: .
- Duyệt tất cả cặp với : (hằng số chấp nhận được).
Độ phức tạp: .
Code tham khảo
int get_mask(long long x) { int mask = 0; while (x) { mask |= 1 << (x % 10); x /= 10; } return mask; } void solve() { int t; cin >> t; while (t--) { int n; cin >> n; vector<int> cnt(1024, 0); long long res = 0; for (int i = 0; i < n; ++i) { long long x; cin >> x; int a = get_mask(x); cnt[a]++; } for (int i = 0; i < 1024; i++) { res += cnt[i] * (cnt[i] - 1) / 2; for (int j = i + 1; j < 1024; j++) if (i & j) res += cnt[i] * cnt[j]; } cout << res << '\n'; } }
Bình luận