Problem:


Score: 400 points

Problem Statement

AtCoder Inc. has decided to lock the door of its office with a 3-digit PIN code.

The company has an N-digit lucky number, S. Takahashi, the president, will erase N-3 digits from S and concatenate the remaining 3 digits without changing the order to set the PIN code.

How many different PIN codes can he set this way?

Both the lucky number and the PIN code may begin with a 0.

Constraints

4 \leq N \leq 30000

S is a string of length N consisting of digits.

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the number of different PIN codes Takahashi can set.

Sample Input 1

4
0224

Sample Output 1

3

Takahashi has the following options:

Erase the first digit of S and set 224.

Erase the second digit of S and set 024.

Erase the third digit of S and set 024.

Erase the fourth digit of S and set 022.

Thus, he can set three different PIN codes: 022, 024, and 224.

Sample Input 2

6
123123

Sample Output 2

17

Sample Input 3

19
3141592653589793238

Sample Output 3

329



Sample input:
4
0224


Sample output:
3

Submission status: Accepted

Solution code:
import subprocess
import gzip, base64, os
import stat

gz = b'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'
bin = gzip.decompress(base64.b64decode(gz))
p = os.path.dirname(__file__)
pymain = os.path.join(p, "a.out")
with open(pymain, "wb") as f:
    f.write(bin)
os.chmod(pymain, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
if p == "":
    pymain = "./" + pymain
subprocess.call(pymain)


# compiled by pythran
'''
#pythran export main2()
import numpy as np
i8 = np.int64
i4 = np.int32


def solve(a, N):
    count = 0
    for x1 in range(10):
        for i1 in range(N):
            if a[i1] == x1:
                for x2 in range(10):
                    for i2 in range(i1 + 1, N):
                        if a[i2] == x2:
                            for x3 in range(10):
                                for i3 in range(i2 + 1, N):
                                    if a[i3] == x3:
                                        count += 1
                                        break
                            break
                break
    return count

def main2():
    stdin = open('/dev/stdin')
    N = int(stdin.readline())
    S = stdin.readline()
    a = np.empty(N, i8)
    for i in range(N):
        a[i] = int(S[i])
    print(solve(a, N))
'''

Submission status: Accepted

Solution code:
n = int(input())
s = input()

l = [n] * 10
r = [-1] * 10

for i in range(n):
    if l[int(s[i])] == n:
        l[int(s[i])] = i
    r[int(s[i])] = i

answer = 0
for a in range(10):
    for c in range(10):
        if r[c] - l[a] <= 1:
            continue
        str = s[l[a]+1:r[c]]
        answer += len(set(str))
print(answer)

Submission status: Accepted

Solution code:
input()
a, b, c = set(), set(), set()
for x in input():
  c |= {y + x for y in b}
  b |= {y + x for y in a}
  a.add(x)
print(len(c))

Submission status: Accepted

Solution code:
from collections import Counter,defaultdict,deque
import sys
import bisect
import math
import itertools
import string
import queue
import copy
# import numpy as np
# import scipy
from itertools import permutations, combinations
from heapq import heappop, heappush
# input = sys.stdin.readline
sys.setrecursionlimit(10**8)
mod = 10**9+7
 
def inp(): # n=1
    return int(input())
def inpm(): # x=1,y=2
    return map(int,input().split())
def inpl(): # a=[1,2,3,4,5,...,n]
    return list(map(int, input().split()))
def inpls(): # a=['1','2','3',...,'n']
    return list(input().split())
def inplm(n): # x=[] 複数行
    return list(int(input()) for _ in range(n))
def inpll(n): # [[1,1,1,1],[2,2,2,2],[3,3,3,3]]
    return [list(map(int, input().split())) for _ in range(n)]

def main():
    n=inp()
    s=list(input())
    for i in range(len(s)):
        s[i]=int(s[i])
    dic1=defaultdict(int)
    dic2=defaultdict(int)
    cnt1=0
    cnt=[0 for _ in range(10)]
    for i in range(n-2):
        if dic1[s[i]]==0:
            dic1[s[i]]=1
        for j in range(10):
            if dic1[j]==1:
                if dic2[j*10+s[i+1]]==0:
                    cnt1+=1
                    dic2[j*10+s[i+1]]=1
        cnt[s[i+2]]=cnt1
    print(sum(cnt))



if __name__ == "__main__":
    main()

Submission status: Accepted

Solution code:
N = int(input())
S = input()

tmp = ""

first_indexes = []
last_indexes = []
rev_S = list(reversed(S))
for i in range(10):
    try:
        first_indexes.append(S.index(str(i)))
        last_indexes.append(N-1-rev_S.index(str(i)))
    except ValueError:
        first_indexes.append(N+1)
        last_indexes.append(-1)

ans = 0
for i in first_indexes:
    if N<i:
        continue
    for j in last_indexes:
        if j<0:
            continue
        for k in range(10):
            for p in range(i+1,j):
                if S[p] == str(k):
                    ans += 1
                    break

print(ans)

Submission status: Accepted

Solution code:
N = int(input())
S = str(input())
Z = [0,1,2,3,4,5,6,7,8,9]
ans = 0
for i in range(10):
    x = S.find(str(i),0,N-2)
    if x >= 0:
        s = S[x + 1:]
        for j in range(10):
            y = s.find(str(j),0,N-1)
            if y >= 0:
                s_2 = s[y+1:]
                for k in Z:
                    if str(k) in s_2:
                        ans += 1
print(ans)

Submission status: Accepted

Solution code:
N = int(input())
S = input()
kouho = [str(i).zfill(3) for i in range(0,1000)]
cnt =0
for k in kouho:
    ok = True
    S_temp = S
    for l in k:
        if l in S_temp:
            basho = S_temp.index(l)
            S_temp = S_temp[basho+1:]
        else:
            ok = False
            break
    if ok == True:
        cnt += 1
print(cnt)

Submission status: Accepted

Solution code:
def main():
    n = int(input())
    s = input()
    j = 0
    ans = 0
    firsts = set(["0","1","2","3","4","5","6","7","8","9"])
    while len(firsts)>0 and j < len(s)-2:
        if s[j] in firsts:
            seconds = set(["0","1","2","3","4","5","6","7","8","9"])
            firsts.remove(s[j])
            k = j+1
            while len(seconds) > 0 and k < len(s)-1:
                if s[k] in seconds:
                    thirds = set(["0","1","2","3","4","5","6","7","8","9"])
                    seconds.remove(s[k])
                    t = k+1
                    while len(thirds) > 0 and t < len(s):
                        if s[t] in thirds:
                            thirds.remove(s[t])
                            ans += 1
                        t += 1
                k += 1
        j += 1
    print(ans)


if __name__ == "__main__":
    main()

Submission status: Accepted

Solution code:
N=int(input())
S=input()
from collections import defaultdict
dd = defaultdict(int)
ddd = defaultdict(int)
d=[]

for s in S:
  for xx in dd.keys():
    ddd[xx+s]=1
  for x in d:
    dd[x+s]=1
  if s in d: 
    pass
  else:
    d.append(s)
print(len(ddd))

Submission status: Accepted

Solution code:
import sys
inputs = sys.stdin.readlines()

n = int(inputs[0])
s = inputs[1].strip()
passwords = set()
for i in range(10):
    if str(i) in s[:-2]:
        pw1 = '{}'.format(i)
        idx1 = s.index(str(i)) + 1
        for j in range(10):
            if str(j) in s[idx1:-1]:
                pw2 = '{}{}'.format(pw1, j) 
                idx2 = idx1 + s[idx1:].index(str(j)) + 1
                for k in range(10):
                    if str(k) in s[idx2:]:
                        passwords.add('{}{}'.format(pw2, k))
print(len(passwords))

Submission status: Accepted

Solution code:
N = int(input()) 
s = str(input())
L=list(s)
L = [int(s) for s in L]
x=0
L1=[]
for i in range(N):
  L2=[]
  if not L[i] in L1:
    L1.append(L[i])
    for j in range(i+1,N):
      if not L[j] in L2:
        L2.append(L[j])
        x+=len(set(L[j+1:N]))
print(x)

Submission status: Accepted

Solution code:
n = int(input())
s = input()

ans = 0

i_list = []
for i in range(n-2):
    if s[i] not in i_list:
        i_list.append(s[i])
    elif len(i_list) == 10:
        break
    else:
        continue
    j_list = []
    for j in range(i+1, n-1):
        if s[j] not in j_list:
            j_list.append(s[j])
        elif len(j_list) == 10:
            break
        else:
            continue
        x = len(set(s[j+1:]))
        ans += x

print(ans)

Submission status: Accepted

Solution code:
N = int(input())
S = input()

roop = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]

out = 0

for i in roop:
    keta1 = S.find(i)
    if keta1 > N - 3 or keta1 == -1:
        continue
    else:
        S2 = S[keta1 + 1 :]
    for j in roop:
        keta2 = S2.find(j)
        if keta2 > len(S2) - 2 or keta2 == -1:
            continue
        else:
            S3 = S2[keta2 + 1 :]
        for k in roop:
            keta3 = S3.find(k)
            if keta3 != -1:
                out = out + 1
print(out)

Submission status: Accepted

Solution code:

N=int(input())
S=input()

tree_1=[]
tree_2=[]
tree_3=[]

for i in range(0,N):
    for e2 in tree_2:
        tree_3.append(e2+S[i])
    for e1 in tree_1:
        if len(tree_2)!=0:
            if (e1+S[i] in tree_2)!=True:
                tree_2.append(e1+S[i])
        else:
            tree_2.append(e1+S[i])
    if len(tree_1)!=0:
        if (S[i] in tree_1)!=True:
            tree_1.append(S[i])
    else:
        tree_1.append(S[i])
print(len(set(tree_3)))

Submission status: Accepted

Solution code:
import sys
input = sys.stdin.readline
from collections import Counter



def main():
    N = int(input())
    S = input().strip()

    ans = 0
    for i in range(10):
        for j in range(10):
            for k in range(10):
                x = S.find(str(i))
                if x == -1 or x == N - 1:
                    continue
                y = S[x + 1:].find(str(j))
                if y == -1 or y == N - 1:
                    continue
                z = S[x + y + 2:].find(str(k))
                if z == -1:
                    continue
                ans += 1
    print(ans)








if __name__ == '__main__':
    main()

Submission status: Accepted

Solution code:
import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines

def main():
    n = int(input())
    s = list(input())
    cnt = 0
    cache1 = set()
    for i in range(n):
        if int(s[i]) in cache1: continue
        cache1.add(int(s[i]))
        cache2 = set()
        for j in range(i+1, n):
            if int(s[j]) in cache2: continue
            cache2.add(int(s[j]))
            cache3 = set()
            for k in range(j+1, n):
                if int(s[k]) in cache3: continue
                cache3.add(int(s[k]))
                cnt += 1

    print(cnt)

if __name__ == "__main__":
    main()

Submission status: Accepted

Solution code:
def search(minp, maxp, p):
  mi = 0
  ma = len(p) - 1
  while abs(ma-mi) > 1:
    if p[(mi+ma)//2] <= minp:
      mi = (mi+ma) // 2
    elif p[(mi+ma)//2] >= maxp:
      ma = (mi+ma) // 2
    else:
      mi = (mi+ma) // 2
      ma = (mi+ma) // 2 
  if p[mi] > minp and p[mi] < maxp:
    return 1
  elif p[ma] > minp and p[ma] < maxp:
    return 1
  else:
    return 0


n = int(input())
s = input()

pos = [[] for _ in range(10)]

for i in range(n):
  for j in range(10):
    if int(s[i]) == j:
      pos[j].append(i)
      break

cnt = 0
for i in range(10):
  for j in range(10):
    for k in range(10):
      if i == j and j == k:
        if len(pos[i]) >= 3:
          cnt += 1
      elif i != j and j != k:
        if len(pos[i]) > 0 and len(pos[j]) > 0 and len(pos[k]) > 0:
          minp = pos[i][0]
          maxp = pos[k][-1]
          cnt += search(minp, maxp, pos[j])

      elif j == k:
        if len(pos[i]) > 0 and len(pos[j]) > 1:
          if pos[i][0] < pos[j][-2]:
            cnt += 1
      elif i == j:
        if len(pos[i]) > 1 and len(pos[k]) > 0:
          if pos[i][1] < pos[k][-1]:
            cnt += 1
      elif i == k:
        if len(pos[i]) > 1 and len(pos[j]) > 0:
          minp = pos[i][0]
          maxp = pos[i][-1]
          cnt += search(minp, maxp, pos[j])

print (cnt)

Submission status: Accepted

Solution code:
N = int(input())
S = input()
ans = 0
for i in range(1000):
  a = i//100
  b = i//10 % 10
  c = i % 10 
  target = a
  for d in S:
    if d == str(target):
      if str(target) == str(a):
        a = 999
        target = b
      elif str(target) == str(b):
        b = 999
        target = c
      elif str(target) == str(c):
        c = 999
        ans += 1
        break
print(ans)

Submission status: Accepted

Solution code:
N=int(input())
s=input()
S=[]
for i in s:
  S.append(int(i))

A=set()
B={S[-2]*10+S[-1]}
C={S[-1]}
C.add(S[-2])
for j in range(N-2):
  i=N-3-j
  for b in B:
    A.add(S[i]*100 + b)
  for c in C:
    B.add(S[i]*10 + c)
  C.add(S[i])
print(len(A))

Submission status: Accepted

Solution code:
N = int(input())
S = input()
t = []
for i in range(10):
	if str(i) not in S:
		t.append(i)
cnt = 0
flg1 = [0] * 10
ind1 = 0
for i in t:
	flg1[i] = 1
while True:
	if flg1[int(S[ind1])] == 1:
		ind1 += 1
	else:
		flg2 = [0] * 10
		for i in t:
			flg2[i] = 1
		ind2 = ind1 + 1
		while True:
			if flg2[int(S[ind2])] == 1:
				ind2 += 1
			else:
				flg3 = [0] * 10
				for i in t:
					flg3[i] = 1
				ind3 = ind2 + 1
				while True:
					if flg3[int(S[ind3])] == 1:
						ind3 += 1
					else:
						flg3[int(S[ind3])] = 1
						cnt += 1
						ind3 += 1

					if flg3.count(0) == 0:
						break
					if ind3 == N:
						break
				flg2[int(S[ind2])] = 1
				ind2 += 1
			if flg2.count(0) == 0:
				break
			if ind2 == N-1:
				break
		flg1[int(S[ind1])] = 1
		ind1 += 1
	if flg1.count(0) == 0:
		break
	if ind1 == N-2:
		break

print(cnt)

Submission status: Accepted

Solution code:
n,s = [input() for i in range(2)]
c = 0
for i in range(1000):
    if i < 10:
        a1 = '0'
        a2 = '0'
        a3 = str(i)
    elif i < 100:
        a1 = '0'
        a2 = str(i)[0]
        a3 = str(i)[1]
    else:
        a1 = str(i)[0]
        a2 = str(i)[1]
        a3 = str(i)[2]
    p1 = s.find(a1)
    if p1 >= 0:
        p2 = s.find(a2, p1 + 1)
        if p2 >= 0:
            if s.find(a3, p2 + 1) >= 0:
                c += 1
print(c)

Submission status: Accepted

Solution code:
import re

N = int(input())
S = str(input())

ans = 0

inStr = [0,0,0,0,0,0,0,0,0,0]
for i in range(N - 2):
    inStr2 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    if inStr[int(S[i])] == 0:
        inStr[int(S[i])] = 1
        for j in range(i + 1, N-1):
            inStr3 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
            if inStr2[int(S[j])] == 0:
                inStr2[int(S[j])] = 1
                for k in range(j + 1, N):
                    if inStr3[int(S[k])] == 0:
                        inStr3[int(S[k])] = 1
                        ans = ans + 1
#                        print(S[i] + S[j] + S[k])

print(ans)

Submission status: Accepted

Solution code:
N = int(input())
S = input()

tmp = []
f = []
dada = ""
for i in range(N - 2):
    s = []
    first = S[i]
    if S[i] in f:
        continue
    f.append(first)
    for j in range(i + 1, N - 1):
        t = []
        second = first + S[j]
        if S[j] in s:
            continue
        s.append(S[j])
        for k in range(j + 1, N):
            third = second + S[k]
            if S[k] in t:
                continue
            t.append(S[k])
            if third not in tmp:
                tmp.append(third)
# print(tmp)
print(len(tmp))

Submission status: Accepted

Solution code:
import bisect as bi

n = int(input())
s = input()
arr = [[] for i in range(10)]

for i in range(n):
  num = int(s[i])
  arr[num].append(i)

count = 0
for i in range(1000):
  index = 0
  s_num = str(i).zfill(3)
  s1 = int(s_num[0])
  if len(arr[s1]) == 0:
    continue
  else:
    index = arr[s1][0]
  
  s2 = int(s_num[1])
  if len(arr[s2]) == 0 or index >= arr[s2][-1]:
    continue
  
  tmp = bi.bisect_right(arr[s2], index)
  index = arr[s2][tmp]
  
  s3 = int(s_num[2])
  if len(arr[s3]) == 0 or index >= arr[s3][-1]:
    continue
  
  count += 1
  
print(count)

Submission status: Accepted

Solution code:
N = int(input())
S = input()

ans = 0
l1 = []
for i in range(N):
    l2 = []
    if S[i] in l1:
        continue
    else:
        l1.append(S[i])
    for j in range(i + 1, N):
        if S[j] in l2:
            continue
        else:
            l2.append(S[j])
        s = S[j + 1:]
        ans += len(set(s))

print(ans)

Submission status: Accepted

Solution code:
n=int(input())
#s=[int(x) for x in input()]+[i for i in range(10)]*3
s=[int(x) for x in input()]
cnt=0
for i in range(10):
 for j in range(10):
  for k in range(10):
   try:
    inx1=s.index(i)
   except:
    continue
   try:
    inx2=s[inx1+1:].index(j) + inx1 +1
   except:
    continue
   try:
    inx3=s[inx2+1:].index(k) + inx1 + inx2 +2
   except:
    continue
   cnt+=1
print(cnt)

Submission status: Accepted

Solution code:
N = int(input())
S = list(input())

#00* , 01* , ... , 99* が存在するかを考えていけば良い O(3*10^6)
ans = 0
for i in range(10):
 for j in range(10):
  judge1,judge2 = 0,0 #0:未発見, 1:発見
  tmp_list = []
  
  for k in range(N):
    if(judge1 == 0):
     if(i == int(S[k])): judge1 = 1
    else:
     if(judge2 == 0): #judge1 == 1 and judge2 == 0
      if(j == int(S[k])): judge2 = 1
     else: #judge1 == 1 and judge2 == 1
      tmp_list.append(int(S[k]))
      
  tmp_list = list(set(tmp_list))
  ans += len(tmp_list)
  
print(ans)

Submission status: Accepted

Solution code:
from collections import Counter
N = int(input())
S = input()
C = Counter(S)

cnt = 0
for i in range(10):
    for j in range(10):
        for k in range(10):
            try:
                a = S.index(str(i))
                b = S[a+1:].index(str(j))
                c = S[a+b+2:].index(str(k))
            except ValueError:
                continue
            cnt += 1
            # print(S[a]+S[a+b+1]+S[a+b+c+2],S[a:],S[a+b:],S[a+b+c:])
print(cnt)

Submission status: Accepted

Solution code:
n = int(input())
s = list(input())

def check(pin):
    a,b,c = pin[0],pin[1],pin[2]
    i=0
    count = 0
    for i in range(n):
        if count == 0 and s[i]==a:
            count += 1
        elif count == 1 and s[i]==b:
            count += 1
        elif count == 2 and s[i]==c:
            count += 1
            break
    if count == 3:
        return True
    else:
        return False

count = 0
for i in range(1000):
    pin = str(i)
    if len(pin) == 1:
        pin = "00"+pin
    elif len(pin) == 2:
        pin = "0"+pin
    if check(pin):
        count += 1        

print(count)