Submission
Status:
-P--------
Subtask/Task Score:
10/100
Score: 10
User: angpangSK
Problemset: Strobogrammatic Numbers
Language: c
Time: 0.006 second
Submitted On: 2025-09-25 20:06:11
#include <stdio.h>
#include <string.h>
#define MAXLEN 20
const char *lowS, *highS;
long long ans = 0;
const char pairsL[] = {'0','1','6','8','9'};
const char pairsR[] = {'0','1','9','8','6'};
void buildAndCount(char *buf, int l, int r) {
if (l > r) {
buf[r+1] = '\0';
int len = strlen(buf);
if (len > 1 && buf[0] == '0') return;
int lowLen = strlen(lowS);
int highLen = strlen(highS);
if (len < lowLen || len > highLen) return;
if (len == lowLen && strcmp(buf, lowS) < 0) return;
if (len == highLen && strcmp(buf, highS) > 0) return;
ans++;
return;
}
if (l == r) {
const char mid[] = {'0','1','8'};
for (int i = 0; i < 3; i++) {
buf[l] = mid[i];
buildAndCount(buf, l+1, r-1);
}
return;
}
for (int i = 0; i < 5; i++) {
if (l == 0 && pairsL[i] == '0' && (r > 0)) continue;
buf[l] = pairsL[i];
buf[r] = pairsR[i];
buildAndCount(buf, l+1, r-1);
}
}
int main() {
static char lowBuf[MAXLEN], highBuf[MAXLEN], buf[MAXLEN];
if (scanf("%s", lowBuf) != 1) return 0;
if (scanf("%s", highBuf) != 1) return 0;
lowS = lowBuf;
highS = highBuf;
int minLen = strlen(lowS);
int maxLen = strlen(highS);
for (int len = minLen; len <= maxLen; len++) {
buf[len] = '\0';
buildAndCount(buf, 0, len - 1);
}
printf("%lld\n", ans);
return 0;
}