Advertisement
Guest User

Untitled

a guest
Dec 23rd, 2018
554
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1.     //#include "testlib.h"
  2.     #include <bits/stdc++.h>
  3.     using namespace std;
  4.      
  5.     vector < pair < int , int > > v[30][30];
  6.      
  7.     int single[30];
  8.      
  9.      
  10.     long long calc(int a , int b){
  11.      
  12.         sort(v[a][b].begin() , v[a][b].end());
  13.      
  14.         vector < pair < int , int > > vec;
  15.      
  16.         for(auto P : v[a][b]){
  17.      
  18.             while(!vec.empty() && vec.back().second <= P.second)
  19.                 vec.pop_back();
  20.             vec.push_back(P);
  21.         }
  22.      
  23.         int last = 0;
  24.      
  25.         long long ret = 0;
  26.      
  27.         for(auto P : vec){
  28.      
  29.             ret += 1ll * (P.first - last) * P.second;
  30.      
  31.             last = P.first;
  32.      
  33.         }
  34.      
  35.         return ret;
  36.     }
  37.     int main(){
  38.         int T;
  39.         cin>>T;
  40.         while(T--){
  41.             string str;
  42.             int n;
  43.             cin>>n>>str;
  44.             for(int j = 0 ; j < 30 ; j++){
  45.                 single[j] = 0;
  46.                 for(int i = 0 ; i < 30 ; i++)
  47.                     v[j][i].clear();
  48.             }
  49.             int last = -1 , c = 0;
  50.             vector < pair < int , int > > letters;
  51.             for(int j = 0 ; j < str.size() ; j++){
  52.                 if(str[j] != last){
  53.                     if(j) letters.push_back({last , c});
  54.      
  55.                     last = str[j];
  56.                     c = 1;
  57.                 }
  58.                 else ++c;
  59.             }
  60.             if(c) letters.push_back({last , c});
  61.      
  62.             for(int j = 0 ; j < letters.size() ; j++){
  63.                 int let = letters[j].first - 'a';
  64.                 single[let] = max(single[let] , letters[j].second);
  65.             }
  66.             for(int j = 0 ; j + 1 < letters.size() ; j++){
  67.                 int a = letters[j].first - 'a' , b = letters[j+1].first - 'a';
  68.                 //cout<<a<<' '<<b<<endl;
  69.                 v[a][b].push_back({letters[j].second , letters[j+1].second});
  70.             }
  71.      
  72.             long long ans = 0;
  73.      
  74.             for(int j = 0 ; j < 26 ; j++){
  75.                 ans += single[j];
  76.                 for(int i = 0 ; i < 26 ; i++){
  77.                     ans += calc(j , i);
  78.                 }
  79.             }
  80.             cout<<ans<<endl;
  81.         }
  82.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement