<p><strong>Attention</strong>: In this version, the number of operations that can be performed, has been increased to <strong>twice</strong>.<!-- notionvc: 278e7cb2-3b05-42fa-8ae9-65f5fd6f7585 --></p>

<p>You are given an array <code>nums</code> consisting of positive integers.</p>

<p>We call two integers <code>x</code> and <code>y</code> <strong>almost equal</strong> if both integers can become equal after performing the following operation <strong>at most <u>twice</u></strong>:</p>

<ul>
	<li>Choose <strong>either</strong> <code>x</code> or <code>y</code> and swap any two digits within the chosen number.</li>
</ul>

<p>Return the number of indices <code>i</code> and <code>j</code> in <code>nums</code> where <code>i &lt; j</code> such that <code>nums[i]</code> and <code>nums[j]</code> are <strong>almost equal</strong>.</p>

<p><strong>Note</strong> that it is allowed for an integer to have leading zeros after performing an operation.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">nums = [1023,2310,2130,213]</span></p>

<p><strong>Output:</strong> <span class="example-io">4</span></p>

<p><strong>Explanation:</strong></p>

<p>The almost equal pairs of elements are:</p>

<ul>
	<li>1023 and 2310. By swapping the digits 1 and 2, and then the digits 0 and 3 in 1023, you get 2310.</li>
	<li>1023 and 213. By swapping the digits 1 and 0, and then the digits 1 and 2 in 1023, you get 0213, which is 213.</li>
	<li>2310 and 213. By swapping the digits 2 and 0, and then the digits 3 and 2 in 2310, you get 0213, which is 213.</li>
	<li>2310 and 2130. By swapping the digits 3 and 1 in 2310, you get 2130.</li>
</ul>
</div>

<p><strong class="example">Example 2:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">nums = [1,10,100]</span></p>

<p><strong>Output:</strong> <span class="example-io">3</span></p>

<p><strong>Explanation:</strong></p>

<p>The almost equal pairs of elements are:</p>

<ul>
	<li>1 and 10. By swapping the digits 1 and 0 in 10, you get 01 which is 1.</li>
	<li>1 and 100. By swapping the second 0 with the digit 1 in 100, you get 001, which is 1.</li>
	<li>10 and 100. By swapping the first 0 with the digit 1 in 100, you get 010, which is 10.</li>
</ul>
</div>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>2 &lt;= nums.length &lt;= 5000</code></li>
	<li><code>1 &lt;= nums[i] &lt; 10<sup>7</sup></code></li>
</ul>

class Solution:
    def countPairs(self, nums: List[int]) -> int:
        
        @cache
        def h(num):

            res = set()
            pick = [i for i in num]
            l = len(num)

            def h(k, a, b):
                nonlocal pick, res

                if k <= 1:
                    res.add(''.join(pick))

                if k == 2:

                    res.add(''.join(pick))
                    # return ''.join(pick)
                    return
                
                for i in range(l):
                    for j in range(l):
                        if i == j or {a, b} == {i, j}:
                            continue
                        
                        pick[i], pick[j] = pick[j], pick[i]
                        h(k + 1, i, j)
                        pick[i], pick[j] = pick[j], pick[i]
                
            h(0, -1, -1)
            return res

            


        
        # look = defaultdict(set)
        look = Counter()
        res = 0
        n = len(nums)


        nums = list(map(str, nums))
        maxlen = len(max(nums, key = lambda x : len(x)))

        # print(maxlen)
        # print(h('1023'))
        
        
        for i in range(n):
            nums[i] = nums[i].rjust(maxlen, '0')
        

        for i in range(n - 1, -1, -1):

            loc = h(nums[i])
            # print(nums[i], loc)
            # print(look)
            # print('-------------------------------')
            thisres = set()

            # for k in loc:
            #     if k in look:
            #         thisres = thisres.union(look[k])
                
            #     # look[k] = look[k].union(i)
            #     look[k].add(i)

            for k in loc:
                if k in look:
                    res += look[k]
            
            look[nums[i]] += 1

            # print(nums[i], thisres)
            # res += len(thisres)
        
        return res

        # 2130
        # 0213
            
        # 2130


82733