Hướng dẫn giải của Bí kíp luyện "Code"

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ả: bachminhkhang

Ý tưởng:

  • Duyệt lần lượt các kí tự trong xâu, nếu gặp chữ cái Tiếng Anh thì sẽ bỏ qua, chỉ xét các chữ số.
  • Dấu hiệu khi chuỗi số kết thúc là kí tự tiếp theo là chữ cái Tiếng Anh hoặc chữ số đang xét là phần tử cuối cùng của xâu.
  • Một số chia hết cho ~3~ khi và chỉ khi tổng của các chữ số trong số đó chia hết cho ~3~.
  • Một số chia hết cho ~5~ khi và chỉ khi chữ số tận cùng của số đó là ~0~ hoặc ~5~.
  • Độ phức tạp: ~O(N)~.

    Code tham khảo

#include<bits/stdc++.h>

using namespace std;

const int N = 5e5 + 7;

string s;
int n;
vector<string> v;

void input()
{
    cin >> n >> s;
}

void solve()
{
    int sum = 0;
    string tmp = "";
    for(int i = 0; i < n; ++i)
    {
        int c = int(s[i]);
        if(c <= 57)
        {
            tmp = tmp + s[i];
            sum += c - 48;
            if( (i == int(s.size()) - 1) || (int(s[i + 1]) > 57))
            {
                if( (sum % 3 == 0) && ((c - 48) % 5 == 0) )
                {
                    v.push_back(tmp);
                }
                sum = 0;
                tmp = "";
            }
        }
    }
    for(int i = 0; i < int(v.size()); ++i)
    {
        cout << v[i];
        if(i < int(v.size()) - 1) cout << '\n';
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    input();
    solve();
    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.