Cod sursa(job #2046006)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 23 octombrie 2017 11:38:19
Problema Perb Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <cstdio>
#include <algorithm>
#include <climits>
#include <cstring>
#include <cctype>

FILE *_fin;
int _in_loc; char _in_buff[4096];

void read_init(const char* nume) {
  _fin = fopen(nume, "r");
  _in_loc = 4095;
}

char read_ch() {
  ++_in_loc;
  if (_in_loc == 4096) {
    _in_loc = 0;
    fread(_in_buff, 1, 4096, _fin);
  }
  return _in_buff[_in_loc];
}

int read_u32() {
  int u32 = 0; char c;
  while (!isdigit(c = read_ch()) && c != '-');
  int sgn = 1;
  if (c == '-') {
    sgn = -1;
  } else {
    u32 = c - '0';
  }
  while (isdigit(c = read_ch())) {
    u32 = u32 * 10 + c - '0';
  }
  return u32 * sgn;
}

const int MAX_N = 600;

int ans[5 + MAX_N][5 + MAX_N];
int freq[5 + MAX_N][4];

int code(char ch) {
  switch (ch) {
    case 'A':
      return 0;
      break;
    case 'C':
      return 1;
      break;
    case 'G':
      return 2;
      break;
  }
  return 3;
}

int main() {
  read_init("perb.in");
  freopen("perb.out", "w", stdout);
  
  int N, M;
  N = read_u32();
  M = read_u32();
  char s[MAX_N + 5];
  for (int i = 1; i <= N; i++) {
    s[i] = read_ch();
  }
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if (i != j) {
        ans[i][j] = INT_MAX;
      }
    }
  }
  for (int i = 1; i <= N; i++) {
    for (int d = 1; d <= (N - i + 1) / 2; d++) {
      memset(freq, 0, sizeof(freq));
      for (int j = i + d - 1; j <= N; j += d) {
        int sol = 0;
        int l = (j - i + 1) / d;
        for (int k = j - d + 1; k <= j; k++) {
          freq[k % d][code(s[k])]++;
          sol += l - std::max(freq[k % d][0], std::max(freq[k % d][1], std::max(freq[k % d][2], freq[k % d][3])));
        }
        if (j - i + 1 > d)
          ans[i][j] = std::min(ans[i][j], sol);
      }
    }
  }
  for (int i = 0; i < M; i++) {
    int x, y;
    x = read_u32();
    y = read_u32();
    printf("%d\n", ans[x][y]);
  }
  return 0;
}