[ABC329C] Count xxx 題解
題目分析
目的:統計本質不同而不是位置不同的所有字元都相同的字串。
需要理解一下什麼是本質不同而不是位置不同。結合樣例1去理解這句話。
列舉樣例1中的所有所有組成字元相同的字串。
aaabaa
編號 | 字串 | 位置 |
---|---|---|
\(1\) | a |
\([1,1]\) |
\(2\) | aa |
\([1,2]\) |
\(3\) | aaa |
\([1,3]\) |
\(4\) | b |
\([4,4]\) |
\(5\) | a |
\([5,5]\) |
\(6\) | aa |
\([6,7]\) |
其中,編號 \(1\) 與編號 \(5\),編號 \(2\) 與編號 \(6\) 都屬於本質相同的字串。所以,所有位置不同的、組成內容相同的字串,最終只需要保留最長的那一個就好。對於一個長度為 \(k\) 的組成內容相同的字串來說, 存在長度為 \(1,2,\dots,k\) 的本質不同的字串,個數即它的長度。
最終,問題即可理解為求出所有字元構成的最長連號長度的總和。
程式碼實現
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
using i64 = long long;
int n;
char c[N];
int maxL[30];//maxL[i]:字母(i+'a')對應的最長連號長度
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
int len = 0;
for (int i = 1; i <= n; i++) {
cin >> c[i];
if (c[i] == c[i - 1]) {//當前元素與前一個元素相同
len++;//連號長度增加
} else {
len = 1;//不同時,開始新的連號
}
//更新當前元素對應的最長連號長度
maxL[c[i]-'a'] = max(maxL[c[i]-'a'], len);
}
//本質不同的串就是最長連號的長度
int ans = 0;
for (int i = 0; i < 26; i++) {
ans += maxL[i];//累加所有元素的最長連號長度
}
cout << ans;
return 0;
}