Submission #109588

#TimeUsernameProblemLanguageResultExecution timeMemory
109588ArturgoLamps (JOI19_lamps)C++14
100 / 100
539 ms67280 KiB
#include <iostream>
#include <bitset>
#include <vector>
using namespace std;

int nbCars;
string deb, fin;

int dyn[1000001][16];

inline bool execute(bool init, bitset<4> bits) {
  if(bits[0])
    init = 0;
  if(bits[1])
    init = 1;
  if(bits[2])
    init = 0;
  if(bits[3])
    init = !init;
  return init;
}

vector<bitset<4>> confPossibles;
vector<bitset<4>> transPossibles[2][2];

int main() {
  ios_base::sync_with_stdio(false);
  cin >> nbCars;
  cin >> deb >> fin;

  for(int iBits = 0;iBits < 16;iBits++) {
    bitset<4> bits(iBits);
    if(bits[0] && bits[2])
      continue;
    confPossibles.push_back(bits);
  }

  for(int bitD = 0;bitD < 2;bitD++) {
    for(int bitF = 0;bitF < 2;bitF++) {
      for(bitset<4> config : confPossibles) {
	if(execute(bitD, config) == bitF) {
	  transPossibles[bitD][bitF].push_back(config);
	}
      }
    }
  }
  
  for(int sol = 0;sol < 16;sol++) {
    dyn[nbCars][sol] = bitset<4>(sol).count();
  }
  for(int pos = nbCars - 1;pos >= 0;pos--) {
    for(bitset<4> bits : confPossibles) {
      int mini = 1000 * 1000;
      for(bitset<4> suiv : transPossibles[deb[pos] - '0'][fin[pos] - '0']) {
	mini = min(dyn[pos + 1][suiv.to_ulong()] + (int)(suiv ^ bits).count(), mini);
      }

      dyn[pos][bits.to_ulong()] = mini;
    }
  }

  cout << dyn[0][0] / 2 << endl;
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...