Cod sursa(job #586772)

Utilizator deneoAdrian Craciun deneo Data 2 mai 2011 21:27:48
Problema Perb Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
# include <cstdio>

using namespace std;

int n, m, div, nr, sol, _max, nprim;

const int prim[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 
73, 79 ,83 ,89, 97, 101 ,103 ,107 ,109 ,113 ,127, 131, 137, 139, 149 ,151, 157, 163, 167, 173, 
179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269 ,271 ,277, 281 ,
283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389 ,397, 401 ,409 ,
419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541 ,
547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659 };

int x, y, a[610][610];
char v[610];
int ap[300];

int getMiscari(int st, int fn, int pas) {
	int ct[5];
	int i, j, _max, rsp = 0;
	for(i = 0; i < pas; ++i) {
		_max = 0;
		for(j = 1; j <= 4; ++j)
			ct[j] = 0;
			
		for(j = st + i; j <= fn; j += pas) 
			++ct[v[j]];
		for(j = 1; j <= 4; ++j)
			if(ct[j] > _max)
				_max = ct[j];
				
		rsp += (fn - st + 1) / pas - _max; 
	}
	return rsp;	
}

int main (){
	int i, j, mxt;
	char c;
	freopen ("perb.in", "r", stdin);
	freopen ("perb.out", "w", stdout);
	
	scanf ("%d%d", &n, &m);
	scanf("%c", &c);
	for(i = 1; i <= n; ++i) {
		scanf("%c", &c);
		switch(c) {
			case 'A': v[i] = 1; break;
			case 'C': v[i] = 2; break;
			case 'G': v[i] = 3; break;
			case 'T': v[i] = 4; break;
		}
	}
	
	for (; m > 0; --m){
		scanf ("%d%d", &x, &y);
		if (a[x][y]) printf ("%d\n", a[x][y]);
		else{
			int num;
            num = y - x + 1;
			
			if (num == 1){
				printf ("0\n");
				continue ;
			}
			sol = 2000000;
			for (nr = 0; prim[nr] < num; ++nr)
					if (num % prim[nr] == 0) {
						mxt = getMiscari(x, y, num / prim[nr]);
						if (sol > mxt && mxt >= 0) sol = mxt;
					}
				mxt = getMiscari(x, y, 1);
			if (sol > mxt && mxt >= 0) sol = mxt;
			printf ("%d\n", sol);
			a[x][y] = sol;
		}
	}
	return 0;
}