Hướng dẫn cho Đếm ký tự (HSG'19)


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: SPyofgame


\(\color{red}{\text{Spoiler Alert}_{{}_{{}^{{}^{v2.0}}}}}\)

\(\color{red}{\text{Khuyến khích bạn đọc trước khi đọc phần lời giải xin hãy thử code ra thuật của mình dù nó có sai hay đúng}}\)

\(\color{red}{\text{Sau đó từ phần bài giải và thuật toán trước đó mà đối chiếu, rút nhận xét với thuật của mình và thu được bài học (không lãng phí thời gian đâu).}}\)



\(\color{orange}{\text{Hint 1 <Brute-focres>}}\)

  • Duyệt và đếm xem mỗi kí tự được nhận bao nhiêu lần, sau đó đếm tất cả các (số lượng xuất hiện là 1) tìm được

\(\color{orange}{\text{Hint 2 <Online Solving>}}\)

  • Vừa duyệt vừa tăng tần số xuất hiện của số

Nếu tần số là 1 là kí tự mới ta tăng biến đếm

Nếu tần số là 2 thì ta giảm biến đếm vì nó không còn thỏa mãn

Nếu tần số lớn hơn 2 thì ta không cần quan tâm vì ta đã xóa nó lúc tần số nó là 2


\(\color{orange}{\text{Hint 3 <Space-Optimize>}}\)

  • Vì mảng chỉ gồm các kí tự in thường nên ta có thể xử lí từng kí tự

\(\color{green}{\text{Preference AC Code }}\): Online Solving

\(^{^{\color{purple}{\text{Complexity : }} O(|s|)\ \color{purple}{\text{time}}\ ||\ O(alphabet)\ \color{purple}{\text{memory}}}}\)

C++
int fre[256] = {}; /// mang tan so
bool isLatin(char c) { return 'a' <= c && c <= 'z'; } /// neu ki tu thoa man
int main()
{
    int delta = 0;
    for (char c; isLatin(c = getchar()); )
    {
        fre[c]++;
        if (fre[c] == 1) delta++; /// ki tu moi va xuat hien 1 lan
        if (fre[c] == 2) delta--; /// ki tu khong con thoa man
    }
    cout << delta;
    return 0;
}


Bình luận

Không có bình luận nào.