読者です 読者をやめる 読者になる 読者になる

AOJ2524 Mysterious Operator

解法
問題の「x+y=a」という式は x-y と x+y を繋げた式。
a を string とみなして切り分ける場所を決める。切り分け方が正しいかどうかのチェックは以下で可能。

  • 切り分けた結果、先頭に0を含まない数字になるかどうか
  • 和より差の方が必ず小さい
  • xとyが両方偶数(両方奇数)なら、xとyの和が偶数(同時に差も偶数)
  • xとyが偶数と奇数のペアなら、xとyの和が奇数(同時に差も奇数)

あとは全ての切り分け方を試せば良い。

#include <iostream>
#include <algorithm>
#include <cmath>
 
using namespace std;
 
int toInt(string s) { return atoi(s.c_str()); }
 
bool solve(string s, string t) {
   
  if(s[0] == '0') return 0;
  if(t[0] == '0') return 0;
   
  int a = toInt(s);
  int b = toInt(t);
   
  if(a > b) return 0;
  if((a + b) % 2 == 1) return 0;
   
  return 1;
}
 
int main() {
   
  string a; cin >> a;
   
  int const N = a.size();
  int ans = 0;
  for(int i=0; i<N; i++) {
    ans += solve(a.substr(0, i), a.substr(i));
  }
   
  cout << ans << endl;
   
  return 0;
}