Cod sursa(job #586846)

Utilizator freak93Adrian Budau freak93 Data 3 mai 2011 02:34:03
Problema Perb Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

const char iname[] = "perb.in";
const char oname[] = "perb.out";

inline int cast(const char &x) {
	if (x == 'A')
		return 0;

	if (x == 'C')
		return 1;

	if (x == 'G')
		return 2;

	return 3;
}

inline int max(const int &A, const int &B) {
	if (A < B)
		return B;
	return A;
}

inline int min(const int &A, const int &B) {
	if (A < B)
		return A;
	return B;
}

int main() {
	freopen(iname, "r", stdin);
	freopen(oname, "w", stdout);
	int N, M; scanf("%d%d", &N, &M);

	char S[650];
	memset(S, 0, sizeof(S)); scanf("%s", S);

	vector< vector<int> > dp(N, vector<int>(N));
	for (int i = 0; i < N; ++i)
		for (int j = i + 1; j < N; ++j)
			dp[i][j] = j - i;

	for (int i = 0; i < N; ++i)
		for (int j = 1; j < N; ++j) {
			if (i + 2 * j > N)
				break;

			vector< vector<int> > apparitions(j, vector<int>(4, 0));
			vector<int> most(j, 0);

			int pas = 0;
			for (int k = i; k + j <= N; k += j) {
				int answer = 0;
				++pas;

				for (int p = 0; p < j; ++p) {
					int castcharacter = cast(S[k + p]);
					most[p] = max(most[p], ++apparitions[p][castcharacter]);
					answer += pas - most[p];
				}

				if (k != i)
					dp[i][k + j - 1] = min(dp[i][k + j - 1], answer);
			}
		}

	for (int i = 0; i < M; ++i) {
		int x, y; scanf("%d%d", &x, &y);
		printf("%d\n", dp[x - 1][y - 1]);
	}
}