Advertisement
t_naveen_2308

Python Template

Mar 2nd, 2024 (edited)
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 23.66 KB | None | 0 0
  1. # Author : Naveen
  2.  
  3. # Program Start
  4. # Libraries Start
  5. from math import *
  6. from collections import deque
  7. from copy import deepcopy
  8. import heapq
  9. import sys
  10.  
  11. # Libraries End
  12.  
  13. # ------------------------------------------------------------------------------------------------------------------
  14.  
  15. # Constants Start
  16. mod1 = 1000000007
  17. mod2 = 998244353
  18. max_if = 200000
  19. inf = float("inf")
  20. neg_inf = float("-inf")
  21. # Constants End
  22.  
  23. # ------------------------------------------------------------------------------------------------------------------
  24.  
  25. # Input Start
  26. # Normal Input Start
  27. inp_int = lambda: int(input())
  28. inp_float = lambda: float(input())
  29. # Normal Input End
  30.  
  31. # Map Input Start
  32. map_int = lambda: map(int, input().split())
  33. map_float = lambda: map(float, input().split())
  34. # Map Input End
  35.  
  36. # List Input Start
  37. list_char = lambda: list(input())
  38. list_str = lambda: input().split()
  39. list_int = lambda: list(map(int, input().split()))
  40. list_float = lambda: list(map(float, input().split()))
  41. # List Input End
  42. # Input End
  43.  
  44. # ------------------------------------------------------------------------------------------------------------------
  45.  
  46. # Basic Functions Start
  47. # Square Root Start
  48. sqrt_int = lambda n: int(sqrt(n))
  49.  
  50. def sqrt_int_u(n):
  51.     k = int(sqrt(n))
  52.     return k if k * k == n else k + 1
  53. # Square Root End
  54.  
  55. # Dictionary Computation Start
  56. def dict_com(l):
  57.     d = {}
  58.     for i in l:
  59.         if i not in d: d[i] = 0
  60.         d[i] += 1
  61.     return d
  62. # Dictionary Computation End
  63.  
  64. # Power Function Start
  65. def power(b, p, mod=mod1):
  66.     assert p >= 0, "Power cannot be negative."
  67.     res = 1
  68.     b %= mod
  69.     while p > 0:
  70.         if p & 1: res = (res * b) % mod
  71.         b = (b * b) % mod
  72.         p >>= 1
  73.     return res
  74.  
  75. def mod_inv(n, mod=mod1):
  76.     assert n >= 0,"The number can't be zero or negative."
  77.     return power(n, mod - 2, mod)
  78. # Power Function End
  79. # Basic Functions End
  80.  
  81. # ------------------------------------------------------------------------------------------------------------------
  82.  
  83. # Algorithms Start
  84. # Fast Fib Start
  85. def fast_fib(n, mod=mod1, is_mod=True):
  86.     assert n >= 0, "The number can't be negative."
  87.     a0, a1 = 0, 1
  88.     str = bin(n)[2:]
  89.     for i in str:
  90.         f2 = a0 * (2 * a1 - a0)
  91.         f21 = a0**2 + a1**2
  92.         if is_mod:
  93.             f2 %= mod
  94.             f21 %= mod
  95.         if i == "1":
  96.             a0, a1 = f21, f2 + f21
  97.             if is_mod:
  98.                 a1 %= mod
  99.         else:
  100.             a0, a1 = f2, f21
  101.     return a0 % mod if is_mod else a0
  102. # Fast Fib End
  103.  
  104. # KMP Algorithm Start
  105. def substr_is_in(text, pattern):
  106.     m = len(pattern)
  107.     n = len(text)
  108.     lps = [0] * m
  109.     while i < m:
  110.         if pattern[i] == pattern[len]:
  111.             len += 1
  112.             lps[i] = len
  113.             i += 1
  114.         else:
  115.             if len:
  116.                 len = lps[len - 1]
  117.             else:
  118.                 lps[i] = 0
  119.                 i += 1
  120.     i = 0
  121.     j = 0
  122.     while i < n:
  123.         if pattern[j] == text[i]:
  124.             i += 1
  125.             j += 1
  126.         if j == m:
  127.             return i - j
  128.         elif i < n and pattern[j] != text[i]:
  129.             if j:
  130.                 j = lps[j - 1]
  131.             else:
  132.                 i += 1
  133.     return -1
  134. # KMP Algorithm End
  135. # Algorithms End
  136.  
  137. # ------------------------------------------------------------------------------------------------------------------
  138.  
  139. # Classes Start
  140. # Modular Class Start
  141. class Modular:
  142.     def __init__(self, value=0, mod=mod1):
  143.         self.mod = mod
  144.         self.value = value % mod if value >= mod or value <= -mod else value
  145.         if self.value: self.value += mod
  146.  
  147.     def __call__(self):
  148.         return self.value
  149.  
  150.     def __int__(self):
  151.         return self.value
  152.  
  153.     def normalize(self, val):
  154.         if isinstance(val, Modular): val = val.value
  155.         if val >= self.mod or val <= -self.mod: val %= self.mod
  156.         if val < 0: val += self.mod
  157.         return val
  158.  
  159.     def __iadd__(self, other):
  160.         other = self.normalize(other)
  161.         self.value = (self.value + other) % self.mod
  162.         return self
  163.  
  164.     def __isub__(self, other):
  165.         other = self.normalize(other)
  166.         self.value = (self.value - other + self.mod) % self.mod
  167.         return self
  168.  
  169.     def __imul__(self, other):
  170.         other = self.normalize(other)
  171.         self.value = (self.value * other) % self.mod
  172.         return self
  173.  
  174.     def pow(self, exp):
  175.         return Modular(power(self.value, exp, self.mod), self.mod)
  176.  
  177.     def mod_in(self):
  178.         return Modular(mod_inv(self.value, self.mod), self.mod)
  179.  
  180.     def __itruediv__(self, other):
  181.         self.value = (self.value * mod_inv(self.normalize(other), self.mod)) % self.mod
  182.         return self
  183.  
  184.     def __ilshift__(self, val):
  185.         self.value = (self.value * pow(2, val, self.mod)) % self.mod
  186.         return self
  187.  
  188.     def __irshift__(self, val):
  189.         self.value = (self.value * mod_inv(pow(2, val, self.mod), self.mod)) % self.mod
  190.         return self
  191.  
  192.     def __add__(self, other):
  193.         result = Modular(self.value, self.mod)
  194.         result += other
  195.         return result
  196.  
  197.     def __sub__(self, other):
  198.         result = Modular(self.value, self.mod)
  199.         result -= other
  200.         return result
  201.  
  202.     def __mul__(self, other):
  203.         result = Modular(self.value, self.mod)
  204.         result *= other
  205.         return result
  206.  
  207.     def __truediv__(self, other):
  208.         result = Modular(self.value, self.mod)
  209.         result /= other
  210.         return result
  211.  
  212.     def __lshift__(self, val):
  213.         result = Modular(self.value, self.mod)
  214.         result <<= val
  215.         return result
  216.  
  217.     def __rshift__(self, val):
  218.         result = Modular(self.value, self.mod)
  219.         result >>= val
  220.         return result
  221.  
  222.     def __neg__(self):
  223.         return Modular(self.mod - self.value, self.mod)
  224.  
  225.     def __eq__(self, other):
  226.         if isinstance(other, Modular): return self.value == other.value
  227.         elif isinstance(other, int): return self.value == other % self.mod
  228.         return NotImplemented
  229.  
  230.     def __ne__(self, other):
  231.         if isinstance(other, Modular): return self.value != other.value
  232.         elif isinstance(other, int): return self.value != other % self.mod
  233.         return NotImplemented
  234.  
  235.     def __lt__(self, other):
  236.         if isinstance(other, Modular): return self.value < other.value
  237.         elif isinstance(other, int): return self.value < other % self.mod
  238.         return NotImplemented
  239.  
  240.     def __le__(self, other):
  241.         if isinstance(other, Modular): return self.value <= other.value
  242.         elif isinstance(other, int): return self.value <= other % self.mod
  243.         return NotImplemented
  244.  
  245.     def __gt__(self, other):
  246.         if isinstance(other, Modular): return self.value > other.value
  247.         elif isinstance(other, int): return self.value > other % self.mod
  248.         return NotImplemented
  249.  
  250.     def __ge__(self, other):
  251.         if isinstance(other, Modular): return self.value >= other.value
  252.         elif isinstance(other, int): return self.value >= other % self.mod
  253.         return NotImplemented
  254.  
  255.     def __repr__(self):
  256.         return f"{self.value}"
  257.  
  258. def mll(value, mod=mod1):
  259.     return Modular(value, mod)
  260. # Modular Class End
  261.  
  262. # PNC Start
  263. class PNC:
  264.     def __init__(self, size=max_if, mod=mod1):
  265.         self.size = size
  266.         self.mod = mod
  267.         self.fact = [1] * (size + 1)
  268.         self.invfact = [1] * (size + 1)
  269.         self.invfact[0] = mod_inv(self.fact[0], mod)
  270.         for i in range(1, size + 1):
  271.             self.fact[i] = (i * self.fact[i - 1]) % mod
  272.             self.invfact[i] = mod_inv(self.fact[i], mod)
  273.  
  274.     def facto(self, n):
  275.         assert n >= 0, "The number can't be negative."
  276.         if n <= self.size: return self.fact[n]
  277.         ans = 1
  278.         for i in range(1, n + 1): ans = (ans * i) % self.mod
  279.         return ans
  280.  
  281.     def perm(self, n, r):
  282.         assert n >= 0 and r >= 0, "The number can't be negative."
  283.         if n < r: return 0
  284.         if n <= self.size: return (self.fact[n] * self.invfact[n - r]) % self.mod
  285.         ans = 1
  286.         for i in range(n - r + 1, n + 1): ans = (ans * i) % self.mod
  287.         return ans
  288.  
  289.     def comb(self, n, r):
  290.         assert n >= 0 and r >= 0, "The number can't be negative."
  291.         if n < r: return 0
  292.         if n <= self.size: return (self.fact[n] * (self.invfact[n - r] * self.invfact[r] % self.mod)) % self.mod
  293.         num, den = 1, 1
  294.         if r > n // 2: r = n - r
  295.         n += 1
  296.         for i in range(1, r + 1):
  297.             num = (num * (n - i)) % self.mod
  298.             den = (den * i) % self.mod
  299.         return (num * mod_inv(den, self.mod)) % self.mod
  300. # PNC End
  301.  
  302. # Prime Number Start
  303. class Prime:
  304.     def __init__(self, size=10**6):
  305.         self.size = size
  306.         self.isprime = [True] * (size + 1)
  307.         self.isprime[0] = self.isprime[1] = False
  308.         self.primes = []
  309.         for i in range(2, sqrt_int_u(size) + 1):
  310.             if self.isprime[i]:
  311.                 for j in range(i * i, size + 1, i): self.isprime[j] = False
  312.         for i in range(2, size + 1):
  313.             if self.isprime[i]: self.primes.append(i)
  314.  
  315.     def is_prime(self, n, old=False):
  316.         assert n > 0, "The given number can't be negative."
  317.         if n == 1: return False
  318.         if n <= 3: return True
  319.         if n % 2 == 0 or n % 3 == 0: return False
  320.         if n <= self.size: return self.isprime[n]
  321.         if old:
  322.             for i in range(5, sqrt_int_u(n), 6):
  323.                 if n % i == 0 or n % (i + 2) == 0: return False
  324.             return True
  325.  
  326.         d = n - 1
  327.         while d % 2 == 0: d //= 2
  328.         def miller(a):
  329.             if a % n == 0: return True
  330.             x = power(a, d, n)
  331.             if x == 1 or x == n - 1: return True
  332.             c = d
  333.             while c < n - 1:
  334.                 x = (x * x) % n
  335.                 if x == n - 1: return True
  336.                 c <<= 1
  337.             return False
  338.         bases64 = [2, 325, 9375, 28178, 450775, 9780504, 1795265022]
  339.         bases32 = [2, 7, 61]
  340.         bases = bases32 if n <= 4294967296 else bases64
  341.         return all(miller(base) for base in bases)
  342. # Prime Number End
  343.  
  344. # Hashing Start
  345. class PolyHash:
  346.     def __init__(self, s):
  347.         self.n = len(s)
  348.         self.s = s
  349.         self.p = 31
  350.         self.hash = [0] * self.n
  351.         self.powers = [1] * self.n
  352.         self.mmi = [1] * self.n
  353.         for i in range(1, self.n):
  354.             self.powers[i] = (self.powers[i - 1] * self.p) % mod1
  355.             self.mmi[i] = mod_inv(self.powers[i])
  356.         self.hash[0] = ord(s[0]) - ord("a") + 1
  357.         for i in range(1, self.n): self.hash[i] = (self.hash[i - 1] + (self.powers[i] * (ord(s[i]) - ord("a") + 1) % mod1)) % mod1
  358.  
  359.     def hash_val(self, L, R):
  360.         if L == 0: return self.hash[R]
  361.         ans = (self.hash[R] - self.hash[L - 1] + mod1) % mod1
  362.         ans = (self.mmi[L] * ans) % mod1
  363.         return ans
  364. # Hashing End
  365. # Classes End
  366.  
  367. # ------------------------------------------------------------------------------------------------------------------
  368.  
  369. # Data Structures Start
  370. # Disjoint Set Union Start
  371. class DisjointSet:
  372.     def __init__(self, n, start=1, ds=None):
  373.         if ds is not None:
  374.             self.num_sets = ds.num_sets
  375.             self.max_size = ds.max_size
  376.             self.parent = list(ds.parent)
  377.             self.min_set = list(ds.min_set)
  378.             self.max_set = list(ds.max_set)
  379.             self.depth = list(ds.depth)
  380.             self.set_size = list(ds.set_size)
  381.         else:
  382.             self.num_sets, self.max_size = n, 1
  383.             n += start
  384.             self.parent, self.min_set, self.max_set = [0] * n, [0] * n, [0] * n
  385.             for i in range(start, n): self.parent[i] = self.min_set[i] = self.max_set[i] = i
  386.             self.depth, self.set_size = [0] * n, [1] * n
  387.  
  388.     def find_set(self, n, recur=True):
  389.         if recur:
  390.             if self.parent[n] == n: return n
  391.             self.parent[n] = self.find_set(self.parent[n])
  392.             return self.parent[n]
  393.         else:
  394.             st = []
  395.             while n != self.parent[n]:
  396.                 st.append(n)
  397.                 n = self.parent[n]
  398.             while len(st) > 0:
  399.                 v = st.pop()
  400.                 self.parent[v] = n
  401.             return n
  402.  
  403.     def is_same_set(self, a, b):
  404.         return self.find_set(a) == self.find_set(b)
  405.  
  406.     def union_set(self, a, b):
  407.         if self.is_same_set(a, b): return
  408.         x, y = self.find_set(a), self.find_set(b)
  409.         if self.depth[x] > self.depth[y]: x, y = y, x
  410.         if self.depth[x] == self.depth[y]: self.depth[y] += 1
  411.         self.parent[x] = y
  412.         self.set_size[y] += self.set_size[x]
  413.         self.max_size = max(self.max_size, self.set_size[y])
  414.         self.min_set[y] = min(self.min_set[y], self.min_set[x])
  415.         self.max_set[y] = min(self.max_set[y], self.max_set[x])
  416.         self.num_sets -= 1
  417.  
  418.     def num_of_sets(self):
  419.         return self.num_sets
  420.  
  421.     def size_of_set(self, n):
  422.         return self.set_size[self.find_set(n)]
  423.  
  424.     def min_of_set(self, n):
  425.         return self.min_set[self.find_set(n)]
  426.  
  427.     def max_of_set(self, n):
  428.         return self.max_set[self.find_set(n)]
  429.  
  430.     def max_size_of_sets(self):
  431.         return self.max_size
  432. # Disjoint Set Union End
  433.  
  434. # Unweighted Graph Start
  435. class UnweightedGraph:
  436.     def __init__(self, a_list, start=1):
  437.         self.a_list = a_list
  438.         self.start = start
  439.         self.end = len(a_list) + start
  440.  
  441.     def dfs(self, src, iter=True):
  442.         self.visited = [False] * self.end
  443.         self.parent = [-1] * self.end
  444.         self.pre = [-1] * self.end
  445.         self.post = [-1] * self.end
  446.         count = 0
  447.         if iter:
  448.             stack = [src]
  449.             while len(stack):
  450.                 p = stack[-1]
  451.                 if not self.visited[p]:
  452.                     self.visited[p] = True
  453.                     self.pre[p] = count
  454.                     count += 1
  455.                 flag = True
  456.                 for i in self.a_list[p]:
  457.                     if not self.visited[i]:
  458.                         self.parent[i] = p
  459.                         stack.append(i)
  460.                         flag = False
  461.                         break
  462.                 if flag:
  463.                     self.post[p] = count
  464.                     count += 1
  465.                     stack.pop()
  466.         else:
  467.  
  468.             def dfs_com(v):
  469.                 nonlocal count
  470.                 self.visited[v] = True
  471.                 self.pre[v] = count
  472.                 count += 1
  473.                 for i in self.a_list[v]:
  474.                     if not self.visited[i]:
  475.                         self.parent[i] = v
  476.                         dfs_com(i)
  477.                 self.post[v] = count
  478.                 count += 1
  479.  
  480.             dfs_com(src)
  481.  
  482.     def bfs(self, src):
  483.         self.level = [-1] * self.end
  484.         self.parent = [-1] * self.end
  485.         self.level[src] = 0
  486.         queue = deque([src])
  487.         while len(queue):
  488.             v = queue.popleft()
  489.             for i in self.a_list[v]:
  490.                 if self.level[i] == -1:
  491.                     self.level[i] = self.level[v] + 1
  492.                     self.parent[i] = v
  493.                     queue.append(i)
  494.  
  495.     def components(self):
  496.         self.component = [-1] * self.end
  497.         seen = self.start
  498.         self.num_of_comp = 0
  499.         while seen < self.end:
  500.             src = -1
  501.             for i in range(self.start, self.end):
  502.                 if self.component[i] == -1:
  503.                     src = i
  504.                     break
  505.             self.bfs(src)
  506.             for i in range(self.start, self.end):
  507.                 if self.level[i] != -1:
  508.                     self.component[i] = self.num_of_comp
  509.                     seen += 1
  510.             self.num_of_comp += 1
  511.  
  512.     def topological_order(self):
  513.         in_degree = [0] * self.end
  514.         self.topo_order = []
  515.         self.path_len = [0] * self.end
  516.         for i in self.a_list:
  517.             for j in self.a_list[i]: in_degree[j] += 1
  518.         queue = deque()
  519.         for i in in_degree:
  520.             if in_degree[i] == 0: queue.append(i)
  521.         while len(queue):
  522.             i = queue.popleft()
  523.             self.topo_order.append(i)
  524.             in_degree[i] = -1
  525.             for j in self.a_list[i]:
  526.                 in_degree[j] -= 1
  527.                 self.path_len[j] = max(self.path_len[j], self.path_len[i] + 1)
  528.                 if in_degree[j] == 0: queue.append(j)
  529. # Unweighted Graph End
  530.  
  531. # Weighted Graph Start
  532. class WeightedGraph:
  533.     def __init__(self, w_list, start=1):
  534.         self.w_list = w_list
  535.         self.start = start
  536.         self.end = len(w_list) + start
  537.  
  538.     def dijkstra(self, src):
  539.         visited = [False] * self.end
  540.         self.distance = [inf] * self.end
  541.         self.distance[src] = 0
  542.         heap = [(0, src)]
  543.         while len(heap) > 0:
  544.             nextv = heapq.heappop(heap)[1]
  545.             if visited[nextv]: continue
  546.             visited[nextv] = True
  547.             for v, d in self.w_list[nextv]:
  548.                 if not visited[v] and self.distance[nextv] + d < self.distance[v]:
  549.                     self.distance[v] = self.distance[nextv] + d
  550.                     heapq.heappush(heap, (self.distance[v], v))
  551.  
  552.     def bellman_ford(self, src):
  553.         self.distance = [inf] * self.end
  554.         self.distance[src] = 0
  555.         for _ in range(self.end - self.start - 1):
  556.             for u in range(self.start, self.end):
  557.                 for v, d in self.w_list[u]: self.distance[v] = min(self.distance[v], self.distance[u] + d)
  558.         for u in range(self.start, self.end):
  559.             for v, d in self.w_list[u]:
  560.                 assert self.distance[u] + d >= self.distance[v], "The graph has negative cycles."
  561.  
  562.     def floyd_warshall(self):
  563.         self.distance_fw = [[inf] * self.end for _ in range(self.end)]
  564.         for u in range(self.start, self.end):
  565.             for v, d in self.w_list[u]: self.distance_fw[u][v] = d
  566.         for i in range(self.start, self.send):
  567.             for j in range(self.start, self.end):
  568.                 for k in range(self.start, self.end):
  569.                     self.distance_fw[j][k] = min(
  570.                         self.distance_fw[j][k],
  571.                         self.distance_fw[j][i] + self.distance_fw[i][k],
  572.                     )
  573.  
  574.     def prim(self):
  575.         visited = [False] * self.end
  576.         self.distance = [inf] * self.end
  577.         self.nbr = [-1] * self.end
  578.         self.distance[self.start] = 0
  579.         heap = []
  580.         heapq.heappush(heap, (0, self.start))
  581.         while len(heap) > 0:
  582.             nextv = heapq.heappop(heap)[1]
  583.             if visited[nextv]:continue
  584.             visited[nextv] = True
  585.             for v, d in self.w_list[nextv]:
  586.                 if not visited[v] and d < self.distance[v]:
  587.                     self.distance[v], self.nbr[v] = d, nextv
  588.                     heapq.heappush(heap, (self.distance[v], v))
  589.  
  590.     def kruskal(self):
  591.         edges = {}
  592.         self.component = DisjointSet(self.end - self.start, self.start)
  593.         self.edge = []
  594.         for u in range(self.start, len(self.w_list) + self.start):
  595.             for v, d in self.w_list[u]:edges.add((d, u, v))
  596.         edges = list(edges)
  597.         edges.sort()
  598.         for d, u, v in edges:
  599.             if self.component.is_same_set(u, v):continue
  600.             self.edge.append((u, v))
  601.             self.component.union_set(u, v)
  602. # Weighted Graph End
  603.  
  604. # Segment Tree Start
  605. class SegmentTree:
  606.     def __init__(self, vec, fun):
  607.         self.size = len(vec)
  608.         self.func = fun
  609.         self.data = deepcopy(vec)
  610.         self.tree = [0] * (4 * self.size)
  611.         self.build_tree(0, 0, self.size - 1)
  612.  
  613.     def build_tree(self, tree_index, left, right):
  614.         if left == right:
  615.             self.tree[tree_index] = self.data[left]
  616.             return
  617.         mid = left + (right - left) // 2
  618.         self.build_tree(2 * tree_index + 1, left, mid)
  619.         self.build_tree(2 * tree_index + 2, mid + 1, right)
  620.         self.tree[tree_index] = self.func(
  621.             self.tree[2 * tree_index + 1], self.tree[2 * tree_index + 2]
  622.         )
  623.  
  624.     def query(self, left, right):
  625.         assert left <= right and left >= 0 and right < self.size, "Given query range is invalid or out of range."
  626.         self.query_left = left
  627.         self.query_right = right
  628.         return self._query(0, 0, self.size - 1)
  629.  
  630.     def _query(self, tree_index, left, right):
  631.         if self.query_left <= left and right <= self.query_right: return self.tree[tree_index]
  632.         mid = left + (right - left) // 2
  633.         if mid < self.query_left or left > self.query_right: return self._query(2 * tree_index + 2, mid + 1, right)
  634.         if right < self.query_left or mid + 1 > self.query_right: return self._query(2 * tree_index + 1, left, mid)
  635.         return self.func(
  636.             self._query(2 * tree_index + 1, left, mid),
  637.             self._query(2 * tree_index + 2, mid + 1, right),
  638.         )
  639.  
  640.     def update(self, index, new_value):
  641.         assert index >= 0 and index < self.size, "Given update index is out of range."
  642.         self.data[index] = new_value
  643.         self.update_index = index
  644.         self.update_new_value = new_value
  645.         self._update(0, 0, self.size - 1)
  646.  
  647.     def _update(self, tree_index, left, right):
  648.         if left == right:
  649.             self.tree[tree_index] = self.update_new_value
  650.             return
  651.         mid = left + (right - left) // 2
  652.         if self.update_index <= mid: self._update(2 * tree_index + 1, left, mid)
  653.         else: self._update(2 * tree_index + 2, mid + 1, right)
  654.         self.tree[tree_index] = self.func(
  655.             self.tree[2 * tree_index + 1], self.tree[2 * tree_index + 2]
  656.         )
  657. # Segment Tree End
  658.  
  659. # Trie Start
  660. class Trie:
  661.     def __init__(self, length=26, chars="abcdefghijklmnopqrstuvwxyz"):
  662.         self.size = length
  663.         self.cnt = 0
  664.         self.freq = [0] * self.size
  665.         self.chars = chars
  666.         self.mp = {c: i for i, c in enumerate(chars)}
  667.         self.child = [None] * self.size
  668.  
  669.     def insert(self, s):
  670.         node = self
  671.         for char in s:
  672.             mask = self.mp[char]
  673.             node.freq[mask] += 1
  674.             if node.child[mask] is None: node.child[mask] = Trie()
  675.             node = node.child[mask]
  676.         node.cnt += 1
  677.  
  678.     def remove(self, s):
  679.         node = self
  680.         for char in s:
  681.             mask = self.mp[char]
  682.             node.freq[mask] -= 1
  683.             if node.freq[mask] == 0:
  684.                 node.child[mask] = None
  685.                 return
  686.             node = node.child[mask]
  687.  
  688.     def search(self, s):
  689.         node = self
  690.         for char in s:
  691.             mask = self.mp[char]
  692.             if node.child[mask] is None: return False
  693.             node = node.child[mask]
  694.         return True
  695. # Trie End
  696. # Data Structures End
  697.  
  698. # ------------------------------------------------------------------------------------------------------------------
  699.  
  700. # Global Variables Start
  701. input = lambda: sys.stdin.buffer.readline().decode().strip()
  702. printf = lambda s: sys.stdout.write(s)
  703. pnc = PNC()
  704. # prime = Prime()
  705. # Global Variables End
  706.  
  707. # ''' # Solution Class Start
  708. class Solution:
  709.     def main(self, index):
  710.     #---------------------------------------------------------------------------------------------------------
  711.  
  712.         n=inp_int()
  713.  
  714.         #printf(f'Case #{index}: {ans}')
  715.  
  716.     #--------------------------------------------------------------------------------------------------------------
  717.  
  718.     test_cases=True
  719. # Solution Class End
  720.  
  721. # Main Function Start
  722. if __name__ == "__main__":
  723.     sol = Solution()
  724.     test_case = 1
  725.     if Solution.test_cases:test_case = int(input())
  726.     for i in range(1, test_case + 1):sol.main(i)
  727. # Main Function End
  728. # ''' # Program End
  729. # ------------------------------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement