제출 #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...