Pagini recente » Cod sursa (job #815740) | Cod sursa (job #2008152) | Cod sursa (job #467046) | Cod sursa (job #832874) | Cod sursa (job #2045990)
#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;
for (int k = j - d + 1; k <= j; k++) {
freq[k % d][code(s[k])]++;
sol += (j - i + 1) / d - 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;
}