Skip to content

Commit e0f3b99

Browse files
committed
Runtime: 0 ms (Top 100.0%) | Memory: 6.70 MB (Top 62.64%)
1 parent 1c3803c commit e0f3b99

File tree

1 file changed

+40
-42
lines changed

1 file changed

+40
-42
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,43 @@
1+
// Runtime: 0 ms (Top 100.0%) | Memory: 6.70 MB (Top 62.64%)
2+
13
class Solution {
24
public:
3-
int superpalindromesInRange(string lef, string rig) {
4-
long L = stol(lef) , R = stol(rig);
5-
int magic = 100000 , ans = 0;
6-
string s = "";
7-
8-
for(int k = 1 ; k < magic ; k++){
9-
s = to_string(k);
10-
for(int i = s.length() - 2 ; i >= 0; i--){
11-
s += s.at(i);
12-
}
13-
long v = stol(s);
14-
v *= v;
15-
if(v > R) break;
16-
if(v >= L && isPalindrome(v)) ans++;
17-
}
18-
19-
for(int k = 1 ; k < magic ; k++){
20-
s = to_string(k);
21-
for(int i = s.length() - 1 ; i >= 0 ; i--){
22-
s += s.at(i);
23-
}
24-
long v = stol(s);
25-
v *= v;
26-
if(v > R) break;
27-
if(v >= L && isPalindrome(v)) ans++;
28-
}
29-
return ans;
30-
}
31-
32-
bool isPalindrome(long x){
33-
return x == reverse(x);
34-
}
35-
36-
long reverse(long x ){
37-
long ans = 0;
38-
while(x > 0){
39-
ans = 10 * ans + x % 10;
40-
x /= 10;
41-
}
42-
return ans;
43-
}
5+
int superpalindromesInRange(string left, string right) {
6+
int ans = 9 >= stol(left) && 9 <= stol(right) ? 1 : 0;
7+
for (int dig = 1; dig < 10; dig++) {
8+
bool isOdd = dig % 2 && dig != 1;
9+
int innerLen = (dig >> 1) - 1,
10+
innerLim = max(1, (int)pow(2, innerLen)),
11+
midPos = dig >> 1, midLim = isOdd ? 3 : 1;
12+
for (int edge = 1; edge < 3; edge++) {
13+
string pal(dig, '0');
14+
pal[0] = (char)(edge + 48);
15+
pal[dig-1] = (char)(edge + 48);
16+
if (edge == 2) innerLim = 1, midLim = min(midLim, 2);
17+
for (int inner = 0; inner < innerLim; inner++) {
18+
if (inner > 0) {
19+
string innerStr = bitset<3>(inner).to_string();
20+
innerStr = innerStr.substr(3 - innerLen);
21+
for (int i = 0; i < innerLen; i++) {
22+
pal[1+i] = innerStr[i];
23+
pal[dig-2-i] = innerStr[i];
24+
}
25+
}
26+
for (int mid = 0; mid < midLim; mid++) {
27+
if (isOdd) pal[midPos] = (char)(mid + 48);
28+
long square = stol(pal) * stol(pal);
29+
if (square > stol(right)) return ans;
30+
if (square >= stol(left) && isPal(to_string(square))) ans++;
31+
}
32+
}
33+
}
34+
}
35+
return ans;
36+
}
4437

45-
};
38+
bool isPal(string str) {
39+
for (int i = 0, j = str.length() - 1; i < j; i++, j--)
40+
if (str[i] != str[j]) return false;
41+
return true;
42+
}
43+
};

0 commit comments

Comments
 (0)