Hướng dẫn giải của Kiểu mới (đề Cần Thơ 2021)


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 viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Hướng dẫn giải

Mỗi dòng là một xâu theo chuẩn CamelCase (có thể chứa dấu cách giữa các từ). Cần đổi sang snake_case: mỗi chữ hoa đứng ở đầu một từ mới (không phải đầu xâu và không ngay sau dấu cách) được thay bằng dấu _ kèm chữ thường tương ứng; mọi ký tự khác giữ nguyên.

Lưu ý: xâu có thể chứa dấu cách nên phải đọc cả dòng bằng getline, không dùng cin >>. Chữ hoa ngay sau dấu cách chỉ được đổi thành chữ thường, không thêm _.

Sub 1: Chèn dần dấu _ vào xâu — ~O(n \cdot |S|^2)~

Duyệt từ cuối xâu về đầu, gặp chữ hoa thì đổi thành chữ thường và chèn _ trước nó (trừ khi đứng đầu hoặc sau dấu cách). Mỗi lần chèn làm xâu dịch chuyển nên tốn thời gian, nhưng ý tưởng rất trực tiếp.

Kết quả chấm: đạt 20/20 test.

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    if (fopen("KIEUMOI.INP", "r")) {
        freopen("KIEUMOI.INP", "r", stdin);
        freopen("KIEUMOI.OUT", "w", stdout);
    }
    string line;
    getline(cin, line);
    int n = stoi(line);
    while (n--) {
        getline(cin, line);
        if (!line.empty() && line.back() == '\r') line.pop_back();
        string s = line;   // xâu có thể chứa dấu cách giữa các từ
        // Duyệt ngược: chữ hoa không đứng đầu và không sau dấu cách thì chèn '_' trước nó (chậm nhưng đúng)
        for (int i = (int)s.size() - 1; i >= 1; i--) {
            if (isupper(s[i])) {
                s[i] = tolower(s[i]);
                if (s[i - 1] != ' ') s.insert(i, "_");
            }
        }
        if (!s.empty()) s[0] = tolower(s[0]);
        cout << s << "\n";
    }
    return 0;
}
Sub 2: Xây xâu kết quả một lượt — ~O(n \cdot |S|)~

Duyệt xâu từ trái sang phải và ghi vào xâu kết quả kq. Với mỗi chữ hoa, nếu nó không đứng đầu và ký tự trước nó không phải dấu cách thì thêm _, sau đó thêm chữ thường. Các ký tự khác được ghi nguyên.

Kết quả chấm: đạt 20/20 test.

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    if (fopen("KIEUMOI.INP", "r")) {
        freopen("KIEUMOI.INP", "r", stdin);
        freopen("KIEUMOI.OUT", "w", stdout);
    }
    string line;
    getline(cin, line);
    int n = stoi(line);
    while (n--) {
        getline(cin, line);
        if (!line.empty() && line.back() == '\r') line.pop_back();
        string kq = "";
        for (int i = 0; i < (int)line.size(); i++) {
            char c = line[i];
            if (isupper(c)) {
                // Chữ hoa đứng sau một chữ thường (không ở đầu xâu, không sau dấu cách) là đầu từ mới: thêm '_'
                if (i > 0 && line[i - 1] != ' ') kq += '_';
                kq += tolower(c);
            } else {
                kq += c;   // chữ thường và dấu cách giữ nguyên
            }
        }
        cout << kq << "\n";
    }
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.