Editorial for Đếm ký tự (HSG'19)
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
\(\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;
}
Comments