1
+ // Runtime: 0 ms (Top 100.0%) | Memory: 6.70 MB (Top 62.64%)
2
+
1
3
class Solution {
2
4
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
+ }
44
37
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