제출 #779241

#제출 시각아이디문제언어결과실행 시간메모리
779241vjudge1Palindrome-Free Numbers (BOI13_numbers)C++17
100 / 100
1 ms396 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pii pair <int, int> #define fi first #define se second #define mp make_pair const int NM = 19; int n, f[NM+5][2][2][11][11], ans = 0; string a, b; pii trans(string &a, string &b, int i, int j, int k, int d){ if (j == 1 && k == 1) return mp(1, 1); if (j == 0 && k == 1){ if (d < a[i+1]) return mp(-1, -1); if (d == a[i+1]) return mp(0, 1); return mp(1, 1); } if (j == 1 && k == 0){ if (d > b[i+1]) return mp(-1, -1); if (d == b[i+1]) return mp(1, 0); return mp(1, 1); } if (d < a[i+1] || d > b[i+1]) return mp(-1, -1); if (d == a[i+1] && d == b[i+1]) return mp(0, 0); if (d == a[i+1]) return mp(0, 1); if (d == b[i+1]) return mp(1, 0); return mp(1, 1); } int solve(string a, string b){ n = a.size(); for (int i = 0; i < n; i++) a[i] -= '0', b[i] -= '0'; memset(f, 0, sizeof(f)); if (a[0] == b[0]){ f[0][0][0][10][a[0]] = 1; } else{ f[0][0][1][10][a[0]] = 1; f[0][1][0][10][b[0]] = 1; for (int i = a[0]+1; i < b[0]; i++) f[0][1][1][10][i]++; } for (int i = 0; i < n-1; i++) for (int j = 0; j < 2; j++) for (int k = 0; k < 2; k++) for (int d1 = 0; d1 <= 10; d1++) for (int d2 = 0; d2 <= 10; d2++){ if (f[i][j][k][d1][d2] == 0) continue; for (int d = 0; d <= 9; d++){ if (d == d1 || d == d2) continue; pii P = trans(a, b, i, j, k, d); if (P.fi == -1) continue; f[i+1][P.fi][P.se][d2][d] += f[i][j][k][d1][d2]; } } int res = 0; for (int j = 0; j < 2; j++) for (int k = 0; k < 2; k++) for (int d1 = 0; d1 <= 10; d1++) for (int d2 = 0; d2 <= 10; d2++) res += f[n-1][j][k][d1][d2]; return res; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> a >> b; if (a == "0" && b == "0"){ cout << 1; return 0; } if (a == "0"){ ans++; a = "1"; } if (a.size() == b.size()){ cout << solve(a, b); return 0; } string s = ""; for (int i = 0; i < a.size(); i++) s.push_back('9'); ans += solve(a, s); s = "1"; for (int i = 1; i < b.size(); i++) s.push_back('0'); ans += solve(s, b); for (int i = a.size()+1; i < b.size(); i++){ string s1 = "1", s2 = ""; for (int j = 0; j < i; j++){ if (j > 0) s1.push_back('0'); s2.push_back('9'); } ans += solve(s1, s2); } cout << ans; return 0; }

컴파일 시 표준 에러 (stderr) 메시지

numbers.cpp: In function 'long long int solve(std::string, std::string)':
numbers.cpp:40:22: warning: array subscript has type 'char' [-Wchar-subscripts]
   40 |   f[0][0][0][10][a[0]] = 1;
      |                      ^
numbers.cpp:43:22: warning: array subscript has type 'char' [-Wchar-subscripts]
   43 |   f[0][0][1][10][a[0]] = 1;
      |                      ^
numbers.cpp:44:22: warning: array subscript has type 'char' [-Wchar-subscripts]
   44 |   f[0][1][0][10][b[0]] = 1;
      |                      ^
numbers.cpp: In function 'int main()':
numbers.cpp:88:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |  for (int i = 0; i < a.size(); i++) s.push_back('9');
      |                  ~~^~~~~~~~~~
numbers.cpp:91:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |  for (int i = 1; i < b.size(); i++) s.push_back('0');
      |                  ~~^~~~~~~~~~
numbers.cpp:93:29: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |  for (int i = a.size()+1; i < b.size(); i++){
      |                           ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...