google code jam 2019 round 1C all questions solutions

1.  ROBOT PROGRAMMING STRATEGY: C++



#include <bits/stdc++.h>
   
#define FOR(i,a,b) for(ll i = (a); i < (ll)(b); i++)
#define REP(i,n) FOR(i,0,n)
#define YYS(x,arr) for(auto& x:arr)
#define PW(x) (1LL<<(x))
#define SZ(x) ((ll)(x).size())

#define pb emplace_back
#define fi first
#define se second

using namespace std;

using ld = long double;
using ll = long long int;

const ll INF = (ll)1e9 + 10;
const ll INFLL = (ll)1e18 + 10;
const ll MOD = 1e9+7;
   
template<class T> T &chmin( T &a , const T &b ){ return a = min(a,b); }
template<class T> T &chmax( T &a , const T &b ){ return a = max(a,b); }
template<class T> void UNIQUE(vector<T> &a){ a.erase(unique(a.begin(), a.end()), a.end()); }

template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){
  os << "(" << v.first << ", " << v.second << ")"; return os;
}
template<class T> ostream& operator << (ostream& os, const vector<T> v){
  for(int i = 0; i < v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;
}
template<class T> ostream& operator << (ostream& os, const vector<vector<T>> v){
  for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}

ll in(){long long int x; assert(scanf("%lld", &x) == 1); return x;}
ld fin(){double x; assert(scanf("%lf", &x) == 1); return x;}
char yuyushiki[1000010]; string stin(){assert(scanf("%s", yuyushiki) == 1); return yuyushiki;}

// head

string solve(){
  ll n = in();
  vector<string> ss(n);
  REP(i, n){
    ss[i] = stin();
  }
  string ans = "";
  vector<bool> live(n, true);
  REP(q, INF){
    ll r = 0;
    ll s = 0;
    ll p = 0;
    REP(i, n){
      if(live[i]){
        char c = ss[i][q%SZ(ss[i])];
        if(c == 'R'){
          r = 1;
        } else if(c == 'S'){
          s = 1;
        } else if(c == 'P'){
          p = 1;
        }
      }
    }
    if(r + s + p == 0){
      break;
    }
    if(r + s + p == 3){
      return "IMPOSSIBLE";
    }
    if(r + s + p == 1){
      if(r == 1){
        ans += 'P';
      } else if(s == 1){
        ans += 'R';
      } else if(p == 1){
        ans += 'S';
      }
      return ans;
    }
    if(r + s + p == 2){
      if(r == 0){
        // s p
        ans += 'S';
        REP(i, n){
          char c = ss[i][q%SZ(ss[i])];
          if(c == 'P'){
            live[i] = false;
          }
        }
      } else if(s == 0){
        // r p
        ans += 'P';
        REP(i, n){
          char c = ss[i][q%SZ(ss[i])];
          if(c == 'R'){
            live[i] = false;
          }
        }
      } else if(p == 0){
        // r s
        ans += 'R';
        REP(i, n){
          char c = ss[i][q%SZ(ss[i])];
          if(c == 'S'){
            live[i] = false;
          }
        }
      }
    }
  }
  return ans;
}

int main(){

  ll t = in();
  FOR(i, 1, t+1){
    string ans = solve();
    printf("Case #%lld: %s\n", i, ans.c_str());
  }

  return 0;
}


2.     POWER ARRANGERS:C++

#include <bits/stdc++.h>
      
#define FOR(i,a,b) for(ll i = (a); i < (ll)(b); i++)
#define REP(i,n) FOR(i,0,n)
#define YYS(x,arr) for(auto& x:arr)
#define PW(x) (1LL<<(x))
#define SZ(x) ((ll)(x).size())

#define pb emplace_back
#define fi first
#define se second

using namespace std;

using ld = long double;
using ll = long long int;

const ll INF = (ll)1e9 + 10;
const ll INFLL = (ll)1e18 + 10;
const ll MOD = 1e9+7;
     
template<class T> T &chmin( T &a , const T &b ){ return a = min(a,b); }
template<class T> T &chmax( T &a , const T &b ){ return a = max(a,b); }
template<class T> void UNIQUE(vector<T> &a){ a.erase(unique(a.begin(), a.end()), a.end()); }

template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){
  os << "(" << v.first << ", " << v.second << ")"; return os;
}
template<class T> ostream& operator << (ostream& os, const vector<T> v){
  for(int i = 0; i < v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;
}
template<class T> ostream& operator << (ostream& os, const vector<vector<T>> v){
  for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}

ll in(){long long int x; assert(scanf("%lld", &x) == 1); return x;}
ld fin(){double x; assert(scanf("%lf", &x) == 1); return x;}
char yuyushiki[1000010]; string stin(){assert(scanf("%s", yuyushiki) == 1); return yuyushiki;}

// head

ll t, f;

ll ask(ll a, ll b){
  ll p = a * 5 + b + 1;
  printf("%lld\n", p);
  fflush(stdout);
  string s = stin();
  return s[0] - 'A';
}

void solve(){
  vector<vector<ll>> a(119, vector<ll>(5, -1));
  vector<bool> live(119, true);
  vector<bool> used(5, false);
  vector<ll> ans(5, -1);
  ll al = 120;
  REP(p, 5){
    vector<ll> cnt(5, 0);
    REP(i, 119){
      if(live[i]){
        ll res = ask(i, p);
        a[i][p] = res;
        cnt[res]++;
      }
    }
    // cerr << cnt << " : " << al / (5 - p) - 1 << endl;
    REP(i, 5){
      if(!used[i] && cnt[i] == al / (5 - p) - 1){
        ans[p] = i;
        used[i] = true;
      }
    }
    REP(i, 119){
      if(a[i][p] != ans[p]){
        live[i] = false;
      }
    }
    al /= 5 - p;
  }
  // cerr << ans << endl;
  REP(i, 5){
    printf("%c", (char)(ans[i] + 'A'));
  }
  printf("\n");
  fflush(stdout);
  string s = stin();
  if(s[0] == 'N'){
    exit(0);
  }
}

int main(){

  t = in();
  f = in();

  REP(i, t){
    solve();
  }
  
  
  return 0;
}


3.   BACTERIAL TACTICS:CPP(c++)

#include <bits/stdc++.h>
      
#define FOR(i,a,b) for(ll i = (a); i < (ll)(b); i++)
#define REP(i,n) FOR(i,0,n)
#define YYS(x,arr) for(auto& x:arr)
#define PW(x) (1LL<<(x))
#define SZ(x) ((ll)(x).size())

#define pb emplace_back
#define fi first
#define se second

using namespace std;

using ld = long double;
using ll = long long int;

const ll INF = (ll)1e9 + 10;
const ll INFLL = (ll)1e18 + 10;
const ll MOD = 1e9+7;
     
template<class T> T &chmin( T &a , const T &b ){ return a = min(a,b); }
template<class T> T &chmax( T &a , const T &b ){ return a = max(a,b); }
template<class T> void UNIQUE(vector<T> &a){ a.erase(unique(a.begin(), a.end()), a.end()); }

template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){
  os << "(" << v.first << ", " << v.second << ")"; return os;
}
template<class T> ostream& operator << (ostream& os, const vector<T> v){
  for(int i = 0; i < v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;
}
template<class T> ostream& operator << (ostream& os, const vector<vector<T>> v){
  for(int i = 0; i < v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;
}

ll in(){long long int x; assert(scanf("%lld", &x) == 1); return x;}
ld fin(){double x; assert(scanf("%lf", &x) == 1); return x;}
char yuyushiki[1000010]; string stin(){assert(scanf("%s", yuyushiki) == 1); return yuyushiki;}

// head

ll n, m;
vector<string> s;

ll memo[16][16][16][16];

ll dfs(ll t, ll l, ll b, ll r){
  if(memo[t][l][b][r] != -1){
    return memo[t][l][b][r];
  }
  vector<bool> nex(256, false);
  FOR(i, t, b){
    FOR(j, l, r){
      if(s[i][j] == '.'){
        // v
        bool f = false;
        FOR(k, t, b){
          if(s[k][j] == '#'){
            f = true;
          }
        }
        if(!f){
          ll res = dfs(t, l, b, j) ^ dfs(t, j+1, b, r);
          nex[res] = true;
        }
        // h
        f = false;
        FOR(k, l, r){
          if(s[i][k] == '#'){
            f = true;
          }
        }
        if(!f){
          ll res = dfs(t, l, i, r) ^ dfs(i+1, l, b, r);
          nex[res] = true;
        }
      }
    }
  }
  REP(i, 256){
    if(!nex[i]){
      return memo[t][l][b][r] = i;
    }
  }
}

ll solve(){
  n = in();
  m = in();
  s.assign(n, "");
  REP(i, n){
    s[i] = stin();
  }
  REP(i, 16){
    REP(j, 16){
      REP(k, 16){
        REP(l, 16){
          memo[i][j][k][l] = -1;
        }
      }
    }
  }
  ll ans = 0;
  ll t = 0, b = n;
  ll l = 0, r = m;
  FOR(i, t, b){
    FOR(j, l, r){
      if(s[i][j] == '.'){
        // v
        bool f = false;
        FOR(k, t, b){
          if(s[k][j] == '#'){
            f = true;
          }
        }
        if(!f){
          ll res = dfs(t, l, b, j) ^ dfs(t, j+1, b, r);
          if(res == 0){
            ans++;
          }
        }
        // h
        f = false;
        FOR(k, l, r){
          if(s[i][k] == '#'){
            f = true;
          }
        }
        if(!f){
          ll res = dfs(t, l, i, r) ^ dfs(i+1, l, b, r);
          if(res == 0){
            ans++;
          }
        }
      }
    }
  }
  return ans;
}

int main(){

  ll t = in();
  FOR(i, 1, t+1){
    ll ans = solve();
    printf("Case #%lld: %lld\n", i, ans);
  }
  
  return 0;
}


Comments

Popular posts from this blog

Amazon Web Services

Hacker Rank all java and python problem solutions

Testing tools for React Apps