1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <iostream>

long long nwd(long long a, long long b) {
	while (b != 0) {
		long long t = b;
		b = a % b;
		a = t;
	}
	return a;
}

int main(int argc, char *argv[])
{
	long long n;
	std::cin >> n;
	long long *kasa = new long long[n];
	for (long long i = 0; i < n; ++i) {
		std::cin >> kasa[i];
	}
	long long m;
	std::cin >> m;
	bool *cykl = new bool[m];
	for (long long i = 0; i < m; ++i) {
		char c;
		std::cin >> c;
		if (c == 'W')
			cykl[i] = true;
		else
			cykl[i] = false;
	}
	long long ilosc_cykli = nwd(n, m); 
	long long dlugosc_cyklu = m / ilosc_cykli;// po ilu rundach typ zacznie dostawac to samo
	long long *sumy_cykli = new long long[ilosc_cykli];
	for (long long i = 0; i < ilosc_cykli; i++)
		sumy_cykli[i] = 0;
	for (long long i = 0; i < ilosc_cykli; ++i) {
		long long pos = i;
		for (long long j = 0; j < dlugosc_cyklu; j += 1) {
			if (cykl[pos])
				sumy_cykli[i] += 1;
			else
				sumy_cykli[i] -= 1;
			pos += ilosc_cykli;
		}
	}
	long long *biedaki_kasa = new long long[ilosc_cykli];
	long long *biedaki_id = new long long[ilosc_cykli];
	for (long long i = 0; i < ilosc_cykli; ++i) {
		biedaki_kasa[i] = 1024*1024;
		biedaki_id[i] = -1;
	}
	for (long long i = 0; i < n; ++i) {
		long long cykl = i % ilosc_cykli;
		if (biedaki_kasa[cykl] > kasa[i]) {
			biedaki_id[cykl] = i;
			biedaki_kasa[cykl] = kasa[i];
		}
	}
	long long *kolejki = new long long[ilosc_cykli];
	long long min_gry = -1;
	for (long long c = 0; c < ilosc_cykli; c++) {
		if (sumy_cykli[c] >= 0) {
			long long pos = biedaki_id[c] % m;
			long long gry = biedaki_id[c]+1;
			long long hajsy = biedaki_kasa[c];
			for (long long i = 0; i < dlugosc_cyklu; i++) {
				if (cykl[pos]) {
					hajsy++;
				} else {
					hajsy--;
					if (hajsy == 0)
						break;
				}
				gry += n;
				pos = (pos + n) % m;
			}
			if (hajsy != 0)
				continue;
			if (min_gry == -1) {
				min_gry = gry;
			} else if (min_gry > gry) {
				min_gry = gry;
			}
			continue;
		}
		long long deficyt = -sumy_cykli[c];
		long long pelne = biedaki_kasa[c] / deficyt;
		long long ostatnia_tura = biedaki_kasa[c] % deficyt;
		if (ostatnia_tura == 0) {
			ostatnia_tura = deficyt;
			pelne--;
		}
		long long gry = dlugosc_cyklu * pelne * n + biedaki_id[c] + 1 - n;

		long long pos = biedaki_id[c] % m;
		while(ostatnia_tura > 0) {
			gry += n;
			if (cykl[pos]) {
				ostatnia_tura ++;
			} else {
				ostatnia_tura --;
			}
			pos = (pos + n) % m;
		}
		if (min_gry == -1)
			min_gry = gry;
		else if (gry < min_gry)
			min_gry = gry;
	}
	std::cout << min_gry << std::endl;
	return 0;
}