Tuyển sinh 🎓 Mình nhận đào tạo lập trình giải thuật thi đấu: thi vào lớp 10 chuyên tin · thi học sinh giỏi tin học cấp tỉnh/thành · thi vào đội tuyển quốc gia · Olympic tin học sinh viên / ICPC · phỏng vấn thuật toán. Bấm vào đây để xem thông tin khóa học → Xem khóa học
Thi thử miễn phí
🏆 Thi thử HSG Tin học tuần này trên ClueOJ
Mở công khai cho mọi người · đề do thầy Nguyễn Việt Nam Sơn biên soạn
Lịch thi, đề cũ & lời giải →

Tách lấy tên từ họ tên

Nguồn: CLUE OJ Độ khó: Dễ Xâu Tách từ

Đề bài

Cho một xâu họ tên chuẩn: gồm các từ chỉ chứa chữ cái, hai từ liền nhau cách nhau đúng một dấu cách, không có dấu cách ở đầu và cuối xâu. Tên là từ cuối cùng của họ tên.

Hãy in ra tên.

Dữ liệu vào:

Một dòng là xâu họ tên chuẩn $S$.

Kết quả:

In ra phần tên.

Giới hạn:

  • $1 \le |S| \le 1000$, $S$ có ít nhất một từ.

Giới hạn thời gian: 1 giây, bộ nhớ: 256 MB. Dữ liệu nhập từ bàn phím và in ra màn hình.

Ví dụ 1 – input
Le Thanh Huy
Ví dụ 1 – output
Huy
Ví dụ 2 – input
Vo Nam
Ví dụ 2 – output
Nam
  • Họ tên có thể có 2, 3, 4… từ; tên luôn là từ cuối cùng.

Nguồn: phỏng theo bài "TÁCH LẤY TÊN" – vinhdinhcoder.net (chủ đề Xâu kí tự).

Lời mở đầu

Họ tên người Việt có thể 2, 3, 4 hay 5 chữ, nhưng tên luôn là chữ cuối cùng. Vậy chỉ cần tìm dấu cách cuối cùng – tên là phần đứng sau nó. Ghi chú: đề gốc chỉ ghi "xâu họ tên không quá dài"; mình chốt độ dài không quá 1000 và cho phép họ tên chỉ có một từ (khi đó tên là cả xâu).

Link nộp bài

Bấm vào nút bên dưới để nộp bài và được hệ thống CLUE OJ chấm tự động.

Nộp bài trên CLUE OJ

Lộ trình lời giải, bấm vào từng phần để nhảy tới:

Bộ testBộ test chính thức có gì?

Bộ test có 20 test, mỗi test đúng được 1 phần điểm như nhau. Có 20 test với họ tên từ 1 tới hơn 100 từ.

TestNội dung kiểm tra
1–2Ví dụ của đề (3 từ và 2 từ)
3Chỉ có một từ
4–5, 8, 14–16, 18–19Họ tên 4, 5, 6 từ hoặc hơn 100 từ – nghĩ "luôn có 3 từ" là sai
6–7, 9–13, 17, 20Họ tên 2–3 từ, tên rất dài, họ ngắn…

Ý tưởngLùi từ cuối xâu tới dấu cách gần nhất

Cho con trỏ p bắt đầu ở kí tự cuối cùng, lùi dần khi s[p] chưa phải dấu cách. Khi dừng, p là vị trí dấu cách cuối cùng (hoặc $-1$ nếu họ tên chỉ có một từ). Tên là xâu con bắt đầu từ p + 1: s.substr(p + 1).

Đọc cả dòng
Họ tên có dấu cách nên phải đọc bằng getline(cin, s). Nếu dùng cin >> s thì chỉ đọc được họ.

Em nhập họ tên rồi bấm Tiếp để xem con trỏ lùi từ cuối xâu:

Ví dụ nhanh:

Lời giảiMột vòng while lùi con trỏ

Chỉ cần một vòng while và hàm substr.

C++▶ Chạy tay từng dòng codeLùi p từ cuối xâu tới dấu cách cuối cùng.
Dữ liệu mẫu:
  1. Điều kiện p >= 0 đứng trước s[p] != ' ' để không truy cập s[-1] khi họ tên chỉ có một từ.
  2. s.substr(k) trả về phần xâu từ vị trí k tới hết; Python viết s[k:].
  3. Có thể dùng sẵn s.rfind(' ') (tìm dấu cách cuối cùng) – khi không có dấu cách nó trả về -1 (thực ra là npos, cộng 1 thành 0) nên vẫn đúng.
Không gian$O(|S|)$
Thời gian$O(|S|)$

Kết quả chạy thật: bản C++ đúng 20/20 test, chạy lâu nhất 0.005s. Bản Python đúng 20/20 test, chạy lâu nhất 0.020s. Full điểm.

Cái bẫyNhững cách làm sai hay gặp

Các cách làm sai mình đã chấm thử trên bộ test:

Cách làm saiĐúngGhi chú
Đọc bằng cin >> s1/20sai test 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Lấy phần sau dấu cách đầu tiên7/20sai test 1, 4, 5, 7, 8, 10, 12, 13, 14, 15, 16, 18, 19
Nghĩ họ tên luôn có 3 từ: cin >> a >> b >> c5/20sai test 2, 3, 4, 5, 6, 8, 9, 11, 14, 15, 16, 17, 18, 19, 20

Tổng kếtKết quả chạy thật trên bộ test

CáchNgôn ngữĐúngLâu nhấtGhi chú
Lời giải chuẩnC++20/200.005sFull điểm
Python20/200.020sFull điểm
cin >> sC++1/20–Mất 19 test
Sau dấu cách đầuC++7/20–Mất 13 test
Luôn 3 từC++5/20–Mất 15 test
Ghi chú của mình: "tìm từ cuối/đầu bằng cách tìm dấu cách cuối/đầu" là thao tác cơ bản khi xử lý họ tên – bài sau (chuẩn hoá họ tên, sắp xếp theo tên…) sẽ dùng lại.
Rất vui khi anh em nào đã đọc đến những dòng cuối cùng này. Anh em đọc chắc cũng mỏi mắt luôn chứ 😅 vậy anh em nghĩ người viết ra hết đống ở trên còn thế nào nữa 🤪. Vậy nên đừng tiếc gì cho mình một lời bình luận hoặc chia sẻ bài viết để động viên mình nè. Chúc anh em học tốt và gặt hái nhiều thành công 😇
Tự học thuật toán: khó ở đâu?
Đọc xong một bài giải là bước đầu. Phần lớn học sinh tự học sẽ gặp những trở ngại sau:
  • Không biết học gì trước, học gì sau, học lan man nên kiến thức bị hổng.
  • Bí bài không ai gỡ, ngồi cả buổi vẫn không ra rồi bỏ cuộc.
  • Code chạy được nhưng không đủ điểm, không biết sai ở đâu, chậm ở đâu.
  • Không có đề thi thử và người chấm, nên không biết mình đang ở mức nào.
  • Dễ nản giữa chừng khi không có ai theo sát.
Học cùng thầy Nam Sơn, các trở ngại đó được gỡ bỏ:
  • Lộ trình 111 buổi video sắp sẵn từ dòng code đầu tiên đến đề HSG thật của các tỉnh.
  • Thầy trực tiếp gỡ bí, chữa bài cho từng em qua nhóm Zalo riêng.
  • Hệ thống chấm bài tự động 24/7 và thi thử HSG hằng tuần để biết chính xác mình đang ở đâu.
  • Đóng học phí một lần, thầy kèm lâu dài: từ thi chuyên Tin đến HSG quốc gia và cả khi lên đại học.

Nhận xét