Cod sursa(job #587825)

Utilizator SpiderManSimoiu Robert SpiderMan Data 5 mai 2011 23:11:06
Problema Perb Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
# include <cstdio>
# include <cstring>

# define max(a, b) (a > b ? a : b)
# define min(a, b) (a < b ? a : b)

const char *FIN = "perb.in", *FOU = "perb.out", *adn = { "ACGT" } ;
const int MAX = 605 ;

char S[MAX] ;
int A[MAX][MAX], B[MAX][MAX] ;
int N, M ;

void solve ( int K ) {
    for ( int i = N; i ; --i ) {
        for ( int j = 0, see = i + K > N; j < 4; ++j ) {
            B[i][j] = (S[i] == adn[j]) + (see ? 0 : B[i + K][j]) ;
        }
    }

    for ( int i = 1; i <= N; ++i ) {
        for ( int j = i + (K << 1) - 1; j <= N; j += K ) {
            int aux = 0;
            for ( int k = 0; k < K; ++k ) {
                int auxdf = 0, see = j + k + 1 <= N ;
                if ( j + k + 1 <= N  ) {
                    for ( int l = 0; l < 4; ++l ) {
                        auxdf = max (auxdf, B[i + k][l] - B[j + k + 1][l]) ;
                    }
                } else {
                    for ( int l = 0; l < 4; ++l ) {
                        auxdf = max (auxdf, B[i + k][l]) ;
                    }
                }
                aux += (j - i + 1) / K - auxdf ;
            }
            A[i][j] = min (A[i][j], aux) ;
        }
    }
}

int main (void) {
    freopen (FIN, "r", stdin) ;
    freopen (FOU, "w", stdout) ;

    scanf ( "%d %d\n", &N, &M ) ;
    fgets ( S + 1, MAX, stdin ) ;
    memset ( A, 0x3f, sizeof ( A ) ) ;

    for ( int i = 1; i <= N >> 1; ++i ) {
        solve (i) ;
    }

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