Cod sursa(job #1504554)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 17 octombrie 2015 21:26:29
Problema Perb Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <cstdio>
#include <algorithm>

#define DIM 610
#define INF 2000000000
using namespace std;

int N, Q, X, Y;
int Answer[DIM][DIM];
int D[5][DIM];
char String[DIM], ch;

int main ()
{
    freopen ("perb.in" ,"r", stdin );
    freopen ("perb.out","w", stdout);

    scanf ("%d %d", &N, &Q );
    scanf ("%c", &ch);

    for (int i = 1; i <= N; i ++)
        scanf ("%c", &String[i]);

    for (int i = 1; i <= N; i ++)
        for (int j = 1; j <= N; j ++)
            Answer[i][j] = INF;

    for (int k = N / 2; k >= 1; k --) {

        for (int p = 1; p <= N; p ++) {
            if (String[p] == 'A') { D[1][p] = 0; D[2][p] = 1; D[3][p] = 1; D[4][p] = 1; }
            if (String[p] == 'C') { D[1][p] = 1; D[2][p] = 0; D[3][p] = 1; D[4][p] = 1; }
            if (String[p] == 'G') { D[1][p] = 1; D[2][p] = 1; D[3][p] = 0; D[4][p] = 1; }
            if (String[p] == 'T') { D[1][p] = 1; D[2][p] = 1; D[3][p] = 1; D[4][p] = 0; }

            if (p >= k) {
                D[1][p] += D[1][p-k];
                D[2][p] += D[2][p-k];
                D[3][p] += D[3][p-k];
                D[4][p] += D[4][p-k];
            }
        }

        for (int i = 1; i <= N-k+1; i ++) {
            for (int j = i+k*2-1; j <= N; j += k) {
                    int value = 0;

                    for (int p = j-k+1; p <= j; p ++) {

                        int val = INF;
                        val = min (D[1][p] - D[1][max(0, i-j+p-1)], val);
                        val = min (D[2][p] - D[2][max(0, i-j+p-1)], val);
                        val = min (D[3][p] - D[3][max(0, i-j+p-1)], val);
                        val = min (D[4][p] - D[4][max(0, i-j+p-1)], val);

                        value += val;
                    }

                    Answer[i][j] = min (Answer[i][j], value);
            }
        }
    }

    for (int i = 1; i <= N; i ++)
        Answer[i][i] = 0;

/*
    for (int i = 1; i <= N; i ++) {
        for (int j = 1; j <= N; j ++)
            printf ("%d ", Answer[i][j]);
        printf ("\n");
    }
*/

    for (int q = 1; q <= Q; q ++) {
        scanf  ("%d %d", &X, &Y);
        printf ("%d\n" , Answer[X][Y]);
    }

    fclose (stdin );
    fclose (stdout);

    return 0;
}