Advertisement
Jaydeep999997

String Reversal

Oct 11th, 2020
2,165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long double ld;
  5. typedef long long int ll;
  6. typedef pair<int, int> pi;
  7. typedef pair<long long, long long> pll;
  8.  
  9. #define endl '\n'
  10. #define ff first
  11. #define ss second
  12. #define pb push_back
  13. #define int long long
  14. #define sz(v) (int)v.size()
  15. #define inf 2147483647
  16. #define llinf 9223372036854775807
  17. #define all(v) v.begin(),v.end()
  18. #define bp(n) __builtin_popcountll(n)
  19. #define f(i,l,r) for(long long i=l;i<=r;i++)
  20. #define rf(i,r,l) for(long long i=r;i>=l;i--)
  21. #define fast ios_base::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
  22.  
  23. template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { os << '{'; string sep; for (const auto &x : v) os << sep << x, sep = ", "; return os << '}'; }
  24. template<typename T, size_t size> ostream& operator<<(ostream &os, const array<T, size> &arr) { os << '{'; string sep; for (const auto &x : arr) os << sep << x, sep = ", "; return os << '}'; }
  25. template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
  26.  
  27. void dbg_out() { cerr << endl; }
  28. template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
  29.  
  30.  
  31. const int N = 1e5 + 5, mod = 1e9 + 7, bit = 61;
  32.  
  33.  
  34. template<typename T>
  35. class fenwick
  36. {
  37. public:
  38.     vector<T> fen;
  39.     int n;
  40.  
  41.     fenwick() {}
  42.  
  43.     fenwick(int _n, T val = T())
  44.     {
  45.         n = _n;
  46.         fen = vector<T> (n + 1, val);
  47.     }
  48.  
  49.     T merge(T a, T b)
  50.     {
  51.         return a + b;
  52.     }
  53.  
  54.     void update(int idx, T val)
  55.     {
  56.         while (idx <= n)
  57.         {
  58.             fen[idx] = merge(fen[idx], val);
  59.             idx += (idx & -idx);
  60.         }
  61.     }
  62.  
  63.     T query(int idx)
  64.     {
  65.         T ans{};
  66.         while (idx > 0)
  67.         {
  68.             ans = merge(ans, fen[idx]);
  69.             idx -= (idx & -idx);
  70.         }
  71.         return ans;
  72.     }
  73.  
  74.     T from(int l, int r)
  75.     {
  76.         return query(r) - query(l - 1);
  77.     }
  78. };
  79.  
  80. vector<int> adj[26];
  81.  
  82. signed main()
  83. {
  84.     fast;
  85.  
  86.  
  87. #ifndef ONLINE_JUDGE
  88.     freopen("input.txt", "r", stdin);
  89.     freopen("output.txt", "w", stdout);
  90. #endif
  91.  
  92.     int t = 1;
  93.     //cin >> t;
  94.     f(tc, 1, t)
  95.     {
  96.         int n;
  97.         cin >> n;
  98.         string fw, bw;
  99.         cin >> fw;
  100.         reverse(all(fw));
  101.         bw = fw;
  102.         reverse(all(fw));
  103.         fw = '#' + fw;
  104.         bw = '#' + bw;
  105.         fenwick<int> obj(n);
  106.         f(i, 1, n)
  107.         {
  108.             int id = fw[i] - 'a';
  109.             adj[id].pb(i);
  110.         }
  111.         int ans = 0;
  112.         rf(i, n, 1)
  113.         {
  114.             int id = bw[i] - 'a';
  115.             int x = adj[id].back();
  116.             adj[id].pop_back();
  117.             int nx = x + obj.query(x);
  118.             obj.update(x, -1);
  119.             ans += i - nx;
  120.         }
  121.         cout << ans << endl;
  122.     }
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement