Pagini recente » Cod sursa (job #426529) | Cod sursa (job #3211340) | Istoria paginii utilizator/surfstyle1234 | Istoria paginii pisicaslaba | Cod sursa (job #587844)
Cod sursa(job #587844)
# include <cstdio>
# include <cstring>
const char *FIN = "perb.in", *FOU = "perb.out", *adn = { "ACGT" } ;
const size_t MAX = 605 ;
char S[MAX] ;
size_t A[MAX][MAX], B[MAX][MAX] ;
size_t N, M ;
inline size_t max ( size_t a, size_t b ) {
return (a > b ? a : b) ;
}
inline size_t min ( size_t a, size_t b ) {
return (a < b ? a : b) ;
}
inline void solve ( size_t K ) {
size_t aux, auxdf ;
for ( size_t i = N; i ; --i ) {
for ( size_t j = 0, see = i + K > N; j < 4; ++j ) {
B[i][j] = (S[i] == adn[j]) + (see ? 0 : B[i + K][j]) ;
}
}
for ( size_t i = 1; i <= N; ++i ) {
for ( size_t j = i + 2 * K - 1; j <= N; j += K ) {
aux = 0;
for ( size_t k = 0; k < K; ++k ) {
auxdf = 0 ;
for ( size_t l = 0, see = j + k + 1 <= N; l < 4; ++l ) {
auxdf = max (auxdf, B[i + k][l] - (see ? B[j + k + 1][l] : 0)) ;
}
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 ( "%u %u\n", &N, &M ) ;
fgets ( S + 1, MAX, stdin ) ;
for ( size_t i = 1; i <= N; ++i ) {
for ( size_t j = i + 1; j <= N; ++j ) {
A[i][j] = j - i ;
}
}
for ( size_t i = 1, j = N >> 1; i <= j; ++i ) {
solve (i) ;
}
for ( size_t i = 1, x, y; i <= M; ++i ) {
scanf ( "%d %d", &x, &y ) ;
printf ( "%d\n", A[x][y] ) ;
}
}