Cod sursa(job #1086372)

Utilizator SRaduRadu Szasz SRadu Data 18 ianuarie 2014 00:36:21
Problema Bowling Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>
#include <cstring>
#include <set>
#include <iostream>

using namespace std;

const int BUFF_MAX = 1000000;

int T, poz, ans[100];

set<int> S;

char buff[BUFF_MAX];

inline int getInt() {
    while(!isdigit(buff[poz])) 
        if(++poz == BUFF_MAX) {
            fread(buff, 1, BUFF_MAX, stdin);
            poz = 0;
        }
    int ans = 0;
    while(isdigit(buff[poz])) {
        ans = ans * 10 + buff[poz++] - '0';
        if(poz == BUFF_MAX) {
            fread(buff, 1, BUFF_MAX, stdin);
            poz = 0;
        }
    } return ans;
}

void preprocess() {
    for(int i = 1; i <= 83; i++) {
        for(int j = 1; j <= i; j++) {
            S.insert(ans[j - 1] ^ ans[i - j]);
            if(j + 1 <= i) S.insert(ans[j - 1] ^ ans[i - (j + 1)]);
        }
        for(int j = 0; ; j++) 
            if(!S.count(j)) {
                ans[i] = j;
                break;
            } S.clear();
    }
}

inline int getValue(int A) {
    if(A < 72) return ans[A];
    return ans[(A - 72) % 12 + 72];
}

int main() {
    freopen("bowling.in", "r", stdin);
    freopen("bowling.out", "w", stdout);
    preprocess();
    fread(buff, 1, BUFF_MAX, stdin);
    /*for(int i = 1; i <= 83; i++) 
        printf("%d\n", ans[i]);*/
    for(T = getInt(); T; T--) {
        int N = getInt(), perioada = 0, ans = 0;
        for(int i = 1, A; i <= N; i++) {
            A = getInt();
            if(A) perioada++;
            if(!A && perioada) {
                ans ^= getValue(perioada);
                perioada = 0;
            }
        }
        if(perioada) ans ^= getValue(perioada);
        printf("%s\n", (ans ? "Nargy" : "Fumeanu"));
    } fclose(stdin); fclose(stdout);
}