fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4.  
  5. std::uint16_t apply_filters(std::uint16_t init,
  6. const std::vector<std::uint16_t>& filters,
  7. const std::vector<bool>& mask)
  8. {
  9. auto res = init;
  10. for (std::size_t i = 0; i != filters.size(); ++i) {
  11. if (mask[i]) {
  12. res ^= filters[i];
  13. }
  14. }
  15. return res;
  16. }
  17.  
  18. bool increase(std::vector<bool>& bs)
  19. {
  20. for (std::size_t i = 0; i != bs.size(); ++i) {
  21. bs[i] = !bs[i];
  22. if (bs[i] == true) {
  23. return true;
  24. }
  25. }
  26. return false; // overflow
  27. }
  28.  
  29.  
  30. std::size_t count_filters_combination(std::uint16_t init,
  31. const std::vector<std::uint16_t>& filters)
  32. {
  33. std::vector<bool> bs(filters.size());
  34.  
  35. std::size_t count = 0;
  36. const std::uint16_t expected = 0b1111111111;
  37. do
  38. {
  39. if (expected == apply_filters(init, filters, bs)) {
  40. ++count;
  41. }
  42. } while (increase(bs));
  43. return count;
  44. }
  45.  
  46.  
  47. int main()
  48. {
  49. std::cout << count_filters_combination(0b1111111111, {0, 0}) << std::endl;
  50. std::cout << count_filters_combination(0b0101010101, {0b1010101010, 0b1000000000, 0b0010101010}) << std::endl;
  51. }
  52.  
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
4
2