Cod sursa(job #586733)

Utilizator deneoAdrian Craciun deneo Data 2 mai 2011 20:34:46
Problema Perb Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include<cstdio>
using namespace std;

int v[800], n, m;
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 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, st, fn, _min, ax, t, k, relem, elem;
	char c; 
	int rsp[602][602];
	
	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(i = 1; i <= n; ++i)
		for(j = i; j <= n; ++j)
			rsp[i][j] = -1;
	for(; m; --m) {
		scanf("%d%d", &i, &j);
		if(rsp[i][j] == -1) {
			relem = elem;
			elem = (j - i + 1);
				_min = getMiscari(i, j, 1);
				for(k = 0; prim[k] * prim[k] <= relem; ++k)
					if(relem % prim[k] == 0) {
						if( (ax = getMiscari(i, j, elem / prim[k])) < _min )
							_min = ax;
						while(relem % prim[k] == 0)
							relem /= prim[k];
					}
				if(relem != 1)
					if( (ax = getMiscari(i, j, elem / relem)) < _min )
						_min = ax;
				rsp[i][j] = _min;
		}
		printf("%d\n", rsp[i][j]);
	}
	return 0;
}