Cod sursa(job #1503225)

Utilizator felixiPuscasu Felix felixi Data 15 octombrie 2015 18:55:49
Problema Perb Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstring>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream in("perb.in");
ofstream out("perb.out");

const int NMAX  = 600;
const int SIGMA = 300;

int r[4][NMAX+2];
int v[NMAX+2];
int d[600+2][600+2];
int N, Q;

int main()
{
    in >> N >> Q;  in.get();
    for( int i = 1;  i <= N;  ++i ) {
        char c;
        in.get( c );
        int nr;
        if( c == 'A' ) nr = 0;
        else if( c == 'C' ) nr = 1;
        else if( c == 'G' ) nr = 2;
        else if( c == 'T' ) nr = 3;
        v[i] = nr;
    }
    for( int dd = 1;  dd < N;  ++dd ) {
        for( int st = 1;  st <= N;  ++st ) {
            memset( r, 0, sizeof(r) );
            for( int fn = st, pas = 1;  fn <= N;  ++fn, ++pas ) {
                r[0][ fn % dd ] += ( v[fn] == 0 );
                r[1][ fn % dd ] += ( v[fn] == 1 );
                r[2][ fn % dd ] += ( v[fn] == 2 );
                r[3][ fn % dd ] += ( v[fn] == 3 );
                int LEST = st, LEFN = fn;

                if( pas % dd == 0 && dd != pas ) {
                    int Ans = 0;
                    for( int p = 0;  p < dd;  ++p ) {
                        int mx = max( max(r[0][p] , r[1][p]) , max(r[2][p] , r[3][p]) );
                        Ans += ( r[0][p] + r[1][p] + r[2][p] + r[3][p] - mx );
                    }
                    d[LEST][LEFN] = Ans;
                }
            }
        }
    }
    for( int i = 1;  i <= Q;  ++i ) {
        int x, y;
        in >> x >> y;
        if( x > y )  swap(x, y);
        out << d[x][y] << '\n';
    }
    return 0;
}