[ABC329C] Count xxx 題解

咸鱼爱学习發表於2024-04-23

[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;
}

相關文章