SRM317 D1E-D2M PalindromicNumbers

何故か https://competitiveprogramming.info/topcoder/srm に317のlinkが無い.


回文となっている数字が$lower \sim upper$まで数えていくつあるか.制約は$\leq 10 ^9$と大きいが,大きい数の回文数というのは$1 \sim 10000$の数字を反転させたものになっているはずなので,偶数桁の場合はそのまま反転,奇数桁の場合は真ん中に$0 \sim 9$をはさんだ数をsetに突っ込んでいく.答えはsetの大きさになる.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++)
#define INF 1<<30
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> P;

bool ch(int x) {
  string s = "";
  while(x) {
      s += char('0' + x % 10);
      x /= 10;
  }

  reverse(s.begin(), s.end());
  rep(i, s.size()/2) {
      if(s[i] == s[s.size()-1-i]) continue;
      return false;
  }
  return true;
}

vector<ll> rev(int x) {
  string s = "";
  while(x) {
      s += char('0' + x % 10);
      x /= 10;
  }
  string t = s;
  reverse(s.begin(), s.end());

  vector<string> v;
  v.push_back(s + t);

  rep(i, 10) {
      string ns = s + char('0' + i) + t;
      v.push_back(ns);
  }

  vector<ll> res;
  rep(i, v.size()) {
      ll ret = 0, k = 1;
      for(int j = v[i].size()-1; j >= 0; j--) {
          ret += int(v[i][j] - '0') * k;
          k *= 10;
      }
      res.push_back(ret);
  }

  return res;
}

class PalindromicNumbers {

    public:

    int countPalNums(int lower, int upper) {
      set<int> st;
      for(ll i = 1; i <= 10000; i++) {
          if(lower <= i && i <= upper && ch(i) && st.find(i) == st.end()) {
              st.insert(i);
          }
          
          vector<ll> ret = rev(i);
          rep(j, ret.size()) {
              int x = ret[j];
              if(lower <= x && x <= upper && ch(x) && st.find(x) == st.end()) {
                  st.insert(x);
              }
          }
      }

      return st.size();
    }
};
Oct 26th, 2016