fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. int n;
  5. string s;
  6. cin >> n;
  7. cin >> s;
  8. vector<pair<char, long long> > b;
  9. b.push_back({'-', 0});
  10. {
  11. int cnt = 0;
  12. for(int i = 0; i < n; i++){
  13. if(i != 0){
  14. if(s[i] != s[i - 1]){
  15. b.push_back({s[i - 1], cnt});
  16. cnt = 0;
  17. }
  18. }
  19. cnt++;
  20. }
  21. b.push_back({s[s.size() - 1], cnt});
  22. }
  23. n = b.size();
  24. vector<long long> pref_sum(n + 1, 0);
  25. vector<vector<long long> > pref_sum1(n + 1, vector<long long>(3, 0));
  26. long long ans = 0;
  27. vector<long long> lt(3, 0);
  28. vector<long long> ass(3, -1);
  29. for(int i = 1; i < n; i++){
  30. pref_sum[i] += pref_sum[i - 1];
  31. pref_sum1[i][i % 2] += pref_sum1[i - 1][i % 2];
  32. pref_sum1[i][(i + 1) % 2] = pref_sum1[i - 1][(i + 1) % 2];
  33. if(i >= 3){
  34. if(b[i].first == b[i - 2].first){
  35. lt[i % 2] = i;
  36. }
  37. }
  38. if(i != 1){
  39. long long max_pos = 0;
  40. max_pos = max(max_pos, ass[(i + 1) % 2] - 1);
  41. max_pos = max(max_pos, lt[i % 2] - 1);
  42. //cout << i << " " << max_pos << " " << pref_sum[i] << " " << pref_sum1[i][i % 2] << " " << endl;
  43. if(max_pos >= 1){
  44. ans += (b[i].second * (pref_sum[max_pos]));
  45. ans += (b[i].second * (pref_sum1[i][(i + 1) % 2] - pref_sum1[max_pos][(i + 1) % 2]));
  46. }
  47. else{
  48. ans += (b[i].second * pref_sum1[i][(i + 1) % 2]);
  49. }
  50. }
  51. if(b[i].second > 1){
  52. ass[i % 2] = i;
  53. }
  54. pref_sum[i] += b[i].second;
  55. pref_sum1[i][i % 2] += b[i].second;
  56. }
  57. /* for(int i = 1; i < n; i++){
  58.   cout << pref_sum[i] << " ";
  59.   }
  60.   cout << endl;*/
  61. cout << ans << endl;
  62. }
  63.  
Success #stdin #stdout 0.01s 5432KB
stdin
4
baba
stdout
6