Cod sursa(job #1069007)

Utilizator poptibiPop Tiberiu poptibi Data 29 decembrie 2013 11:10:32
Problema Perb Scor 80
Compilator cpp Status done
Runda hc_round4 Marime 1.54 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

const int NMAX = 610;

int N, M, MinChanges[NMAX][NMAX], X, Y, Freq[NMAX][4];
char S[NMAX];

int Max(int A, int B, int C, int D)
{
    return max(max(A, B), max(C, D));
}

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

    scanf("%i %i\n", &N, &M);

    for(int i = 1; i <= N; ++ i)
        for(int j = 1; j <= N; ++ j)
            MinChanges[i][j] = 0x3f3f3f3f;

    gets(S + 1);
    for(int Period = 1; Period <= N; Period ++)
        for(int Left = 1; Left + 2 * Period - 1 <= N; ++ Left)
        {
            int NrSecv = 1, Now = 0;

            for(int Right = Left; Right <= N; Right ++)
            {
                int R = (Right - Left + 1) % Period;
                if(NrSecv == 1) Freq[R][0] = Freq[R][1] = Freq[R][2] = Freq[R][3] = 0;
                if(S[Right] == 'A') Freq[R][0] ++;
                else if(S[Right] == 'C') Freq[R][1] ++;
                else if(S[Right] == 'G') Freq[R][2] ++;
                else Freq[R][3] ++;
                Now += NrSecv - Max(Freq[R][0], Freq[R][1], Freq[R][2], Freq[R][3]);
                if(R == 0)
                {
                    if(NrSecv > 1) MinChanges[Left][Right] = min(MinChanges[Left][Right], Now);
                    Now = 0;
                    NrSecv ++;
                }
            }
        }

    for(; M; M --)
    {
        scanf("%i %i", &X, &Y);
        printf("%i\n", MinChanges[X][Y]);
    }
}