Pagini recente » Cod sursa (job #1215144) | Cod sursa (job #163405) | Cod sursa (job #1444187) | Cod sursa (job #1115732) | Cod sursa (job #1572421)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 610, AMAX = 100, inf = 0x3f3f3f3f;
int N, M;
int C[AMAX], DP[NMAX][NMAX], answer[NMAX][NMAX], cnt[NMAX / 2][4], added[NMAX], MOD[NMAX];
char str[NMAX];
int main() {
ios_base::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
assert(freopen("perb.in", "r", stdin) != NULL);
assert(freopen("perb.out", "w", stdout) != NULL);
assert(freopen("debug.err", "w", stderr) != NULL);
#endif
C['A'] = 0;
C['C'] = 1;
C['G'] = 2;
C['T'] = 3;
int d, i, j, k;
scanf("%d %d\n", &N, &M);
scanf("%s", str + 1);
for (i = 1; i <= N; ++i)
str[i] = C[str[i]];
memset(answer, inf, sizeof(answer));
for (d = 1; d <= N / 2; ++d) {
for (i = 1; i <= N; ++i) {
MOD[i] = MOD[i - 1] + 1;
if (MOD[i] >= d)
MOD[i] -= d;
}
for (i = 1; i <= N; ++i) {
memset(cnt, 0, sizeof(cnt));
memset(added, 0, sizeof(added));
for (j = i; j <= N; ++j) {
int index = MOD[j - i + 1];
++cnt[index][str[j]];
int max_index = 0;
for (k = 1; k < 4; ++k)
if (cnt[index][k] > cnt[index][max_index])
max_index = k;
int add = 0;
for (k = 0; k < 4; ++k)
if (max_index != k)
add += cnt[index][k];
DP[i][j] = DP[i][j - 1] - added[index] + add;
added[index] = add;
if (index == 0 && (j - i + 1) / d > 1)
answer[i][j] = min(answer[i][j], DP[i][j]);
}
}
}
char line[20];
getchar();
while (M--) {
gets(line);
i = 0, j = 0;
for (k = 0; line[k] != ' '; ++k)
i = i * 10 + line[k] - '0';
for (++k; line[k]; ++k)
j = j * 10 + line[k] - '0';
cout << answer[i][j] << '\n';
}
return 0;
}