Advertisement
Guest User

Untitled

a guest
Apr 27th, 2013
748
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.93 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <string>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int Maxm = 524288;
  8. const int Maxl = 26;
  9.  
  10. int n, m;
  11. string s;
  12. int freq[Maxm][Maxl], st[Maxm];
  13. int cur[Maxl];
  14. int part1[Maxl], part2[Maxl];
  15.  
  16. void Create(int v, int l, int r)
  17. {
  18.     if (l == r) freq[v][s[l] - 'a']++;
  19.     else {
  20.         int m = l + r >> 1;
  21.         Create(2 * v, l, m); Create(2 * v + 1, m + 1, r);
  22.         for (int i = 0; i < Maxl; i++)
  23.             freq[v][i] = freq[2 * v][i] + freq[2 * v + 1][i];
  24.     }
  25. }
  26.  
  27. void Divide(int freq[], int part1[], int part2[], int need, int flag)
  28. {
  29.     fill(part1, part1 + Maxl, 0); fill(part2, part2 + Maxl, 0);
  30.     if (flag == 1)
  31.         for (int i = 0; i < Maxl; i++) {
  32.             int tk = min(need, freq[i]); need -= tk;
  33.             part1[i] += tk; part2[i] += freq[i] - tk;
  34.         }
  35.     else for (int i = Maxl - 1; i >= 0; i--) {
  36.             int tk = min(need, freq[i]); need -= tk;
  37.             part1[i] += tk; part2[i] += freq[i] - tk;
  38.         }
  39. }
  40.  
  41. void Down(int v, int l, int r)
  42. {
  43.     int m = l + r >> 1;
  44.     st[2 * v] = st[2 * v + 1] = st[v];
  45.     Divide(freq[v], freq[2 * v], freq[2 * v + 1], m - l + 1, st[v]);
  46.     st[v] = 0;
  47. }
  48.  
  49. void Get(int v, int l, int r, int a, int b)
  50. {
  51.     if (l != r && st[v]) Down(v, l, r);
  52.     if (l == a && r == b)
  53.         for (int i = 0; i < Maxl; i++)
  54.             cur[i] += freq[v][i];
  55.     else {
  56.         int m = l + r >> 1;
  57.         if (a <= m) Get(2 * v, l, m, a, min(m, b));
  58.         if (m + 1 <= b) Get(2 * v + 1, m + 1, r, max(m + 1, a), b);
  59.     }
  60. }
  61.  
  62. void Insert(int v, int l, int r, int a, int b, int cnt[], int s)
  63. {
  64.     if (l == a && r == b) {
  65.         for (int i = 0; i < Maxl; i++) freq[v][i] = cnt[i];
  66.         st[v] = s;
  67.     } else {
  68.         if (st[v]) Down(v, l, r);
  69.         int m = l + r >> 1;
  70.         if (b <= m) Insert(2 * v, l, m, a, b, cnt, s);
  71.         else if (m + 1 <= a) Insert(2 * v + 1, m + 1, r, a, b, cnt, s);
  72.         else {
  73.             int part1[Maxl], part2[Maxl];
  74.             Divide(cnt, part1, part2, m - a + 1, s);
  75.             Insert(2 * v, l, m, a, m, part1, s);
  76.             Insert(2 * v + 1, m + 1, r, m + 1, b, part2, s);
  77.         }
  78.         for (int i = 0; i < Maxl; i++)
  79.             freq[v][i] = freq[2 * v][i] + freq[2 * v + 1][i];
  80.     }
  81. }
  82.  
  83. void Traverse(int v, int l, int r)
  84. {
  85.     if (l == r) {
  86.         for (int i = 0; i < Maxl; i++)
  87.             if (freq[v][i]) s[l] = 'a' + i;
  88.     } else {
  89.         if (st[v]) Down(v, l, r);
  90.         int m = l + r >> 1;
  91.         Traverse(2 * v, l, m); Traverse(2 * v + 1, m + 1, r);
  92.     }
  93. }
  94.  
  95. int main()
  96. {
  97.     scanf("%d %d", &n, &m);
  98.     cin >> s;
  99.     Create(1, 0, n - 1);
  100.     while (m--) {
  101.         int l, r; scanf("%d %d", &l, &r); l--; r--;
  102.         fill(cur, cur + Maxl, 0);
  103.         Get(1, 0, n - 1, l, r);
  104.         int odd = 0;
  105.         for (int i = 0; i < Maxl; i++)
  106.             odd += cur[i] % 2;
  107.         if (odd <= 1) {
  108.             fill(part1, part1 + Maxl, 0); fill(part2, part2 + Maxl, 0);
  109.             for (int i = 0; i < Maxl; i++) {
  110.                 part1[i] = (cur[i] + 1) / 2; part2[i] = cur[i] - part1[i];
  111.             }
  112.             int m = l + r >> 1;
  113.             Insert(1, 0, n - 1, l, m, part1, 1); Insert(1, 0, n - 1, m + 1, r, part2, 2);
  114.         }
  115.         Traverse(1, 0, n - 1);
  116.     }
  117.     Traverse(1, 0, n - 1);
  118.     printf("%s\n", s.c_str());
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement