Loading... <div class="tip share">请注意,本文编写于 560 天前,最后修改于 497 天前,其中某些信息可能已经过时。</div> # 竞赛必备 <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-655febf7ed91dde5454a40c2ac050fc9520' role="tab" data-target='#tabs-655febf7ed91dde5454a40c2ac050fc9520'>**Python3**</a></li><li class='nav-item ' role="presentation"><a class='nav-link ' style="" data-toggle="tab" aria-controls='tabs-09c1dc1be6abeb18ae960d11a2de5cfc61' role="tab" data-target='#tabs-09c1dc1be6abeb18ae960d11a2de5cfc61'>**C++**</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-655febf7ed91dde5454a40c2ac050fc9520' class="tab-pane fade active in"> ```python if True: standard_input, packages, output_together = 1, 1, 1 dfs, hashing, read_from_file = 1, 0, 0 de = 1 if standard_input: import io, os, sys read = io.BytesIO(os.read(0, os.fstat(0).st_size)) I = lambda: read.readline() inf = float('inf') def I(): return input() def II(): return int(input()) def MII(): return map(int, input().split()) def LI(): return list(input().split()) def LII(): return list(map(int, input().split())) def LFI(): return list(map(float, input().split())) def GMI(): return map(lambda x: int(x) - 1, input().split()) def LGMI(): return list(map(lambda x: int(x) - 1, input().split())) if packages: from io import BytesIO, IOBase import math import random import os import bisect import typing from collections import Counter, defaultdict, deque from copy import deepcopy from functools import cmp_to_key, lru_cache, reduce from heapq import heapify, heappop, heappush, heappushpop, nlargest, nsmallest from itertools import accumulate, combinations, permutations, count, product from operator import add, iand, ior, itemgetter, mul, xor from string import ascii_lowercase, ascii_uppercase, ascii_letters from typing import * BUFSIZE = 4096 if output_together: class FastIO(IOBase): newlines = 0 def __init__(self, file): self._fd = file.fileno() self.buffer = BytesIO() self.writable = "x" in file.mode or "r" not in file.mode self.write = self.buffer.write if self.writable else None def read(self): while True: b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE)) if not b: break ptr = self.buffer.tell() self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr) self.newlines = 0 return self.buffer.read() def readline(self): while self.newlines == 0: b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE)) self.newlines = b.count(b"\n") + (not b) ptr = self.buffer.tell() self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr) self.newlines -= 1 return self.buffer.readline() def flush(self): if self.writable: os.write(self._fd, self.buffer.getvalue()) self.buffer.truncate(0), self.buffer.seek(0) class IOWrapper(IOBase): def __init__(self, file): self.buffer = FastIO(file) self.flush = self.buffer.flush self.writable = self.buffer.writable self.write = lambda s: self.buffer.write(s.encode("ascii")) self.read = lambda: self.buffer.read().decode("ascii") self.readline = lambda: self.buffer.readline().decode("ascii") sys.stdout = IOWrapper(sys.stdout) if dfs: from types import GeneratorType # 搜索加速 def bootstrap(f, stack=[]): def wrappedfunc(*args, **kwargs): if stack: return f(*args, **kwargs) else: to = f(*args, **kwargs) while True: if type(to) is GeneratorType: stack.append(to) to = next(to) else: stack.pop() if not stack: break to = stack[-1].send(to) return to return wrappedfunc if hashing: RANDOM = random.getrandbits(20) class Wrapper(int): def __init__(self, x): int.__init__(x) def __hash__(self): return super(Wrapper, self).__hash__() ^ RANDOM if read_from_file: file = open("input.txt", "r").readline().strip()[1:-1] fin = open(file, 'r') input = lambda: fin.readline().strip() output_file = open("output.txt", "w") def fprint(*args, **kwargs): print(*args, **kwargs, file=output_file) if de: def debug(*args): print('\033[92m', end='') print(*args) print('\033[0m', end='') ``` </div><div role="tabpanel" id='tabs-09c1dc1be6abeb18ae960d11a2de5cfc61' class="tab-pane fade "> ```cpp ``` </div> </div> </div> # Trie树 <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-393cd5703640740cfe8f36e294e852e658" aria-expanded="true"><div class="accordion-toggle"><span style="">**相关例题**</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-393cd5703640740cfe8f36e294e852e658" class="collapse collapse-content"><p></p> <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-de39f99a09e992f6e6e9d05f0ea93b2a120' role="tab" data-target='#tabs-de39f99a09e992f6e6e9d05f0ea93b2a120'>**力扣**</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-de39f99a09e992f6e6e9d05f0ea93b2a120' class="tab-pane fade active in"> [2707. 字符串中的额外字符](https://leetcode.cn/problems/extra-characters-in-a-string/) </div> </div> </div> <p></p></div></div></div> --- <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-2b313542235289701a6781337f66f8b2850' role="tab" data-target='#tabs-2b313542235289701a6781337f66f8b2850'>**Python3**</a></li><li class='nav-item ' role="presentation"><a class='nav-link ' style="" data-toggle="tab" aria-controls='tabs-ecb0d2f671c5b07506cba168ade9876a181' role="tab" data-target='#tabs-ecb0d2f671c5b07506cba168ade9876a181'>**C++**</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-2b313542235289701a6781337f66f8b2850' class="tab-pane fade active in"> ```python from typing import List class Trie: HIGH_BIT = 30 __slots__ = 'son', 'cnt' def __init__(self): self.son: List[Trie, None] = [None, None] self.cnt = 0 # 子树大小 # 添加节点 def insert(self, num: int) -> None: node = self for i in range(Trie.HIGH_BIT, -1, -1): j = num >> i & 1 if node.son[j] is None: node.son[j] = Trie() node = node.son[j] node.cnt += 1 # 维护子树大小, # 查找num的最大异或值并返回 def query(self, num: int) -> int: node, ans = self, 0 for i in range(Trie.HIGH_BIT, -1, -1): j = num >> i & 1 if node.son[1 - j]: ans |= 1 << i node = node.son[1 - j] else: node = node.son[j] return ans # 从字典树中删除num def remove(self, num: int) -> None: node = self for i in range(Trie.HIGH_BIT, -1, -1): j = num >> i & 1 node.son[j].cnt -= 1 if node.son[j].cnt <= 0: node.son[j] = None # 清空节点 break node = node.son[j] ``` </div><div role="tabpanel" id='tabs-ecb0d2f671c5b07506cba168ade9876a181' class="tab-pane fade "> ```cpp ``` </div> </div> </div> # 并查集 <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-789e1ca8d1ef1bba647c6be7d2fd2d32300' role="tab" data-target='#tabs-789e1ca8d1ef1bba647c6be7d2fd2d32300'>**Python3**</a></li><li class='nav-item ' role="presentation"><a class='nav-link ' style="" data-toggle="tab" aria-controls='tabs-d25cd93ca9aa56ee86f46a3a689aa819471' role="tab" data-target='#tabs-d25cd93ca9aa56ee86f46a3a689aa819471'>**C++**</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-789e1ca8d1ef1bba647c6be7d2fd2d32300' class="tab-pane fade active in"> ```python from typing import List # 并查集 class DisjointSet: __slots__ = 'p', 'rank', 'setCnt' def __init__(self, n: int): self.p: List[int] = list(range(n)) # p[i]:i节点的根节点 self.rank: List[int] = [1] * n # rank[i]:以i节点为根节点的树的深度 self.setCnt: int = n # 根节点(自环)的数量 # 查找根节点,并压缩路径 def find(self, x: int) -> int: if self.p[x] != x: self.p[x] = self.find(self.p[x]) return self.p[x] # 按秩合并 def union(self, a: int, b: int) -> bool: pa, pb = self.find(a), self.find(b) if pa == pb: return False if self.rank[pa] < self.rank[pb]: pa, pb = pb, pa self.rank[pa] += self.rank[pb] self.p[pb] = pa self.setCnt -= 1 return True ``` </div><div role="tabpanel" id='tabs-d25cd93ca9aa56ee86f46a3a689aa819471' class="tab-pane fade "> ```cpp ``` </div> </div> </div> # 树状数组 <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-b9447a56f4bcd675e4bdfc0a84c9b5a4510' role="tab" data-target='#tabs-b9447a56f4bcd675e4bdfc0a84c9b5a4510'>**Python3**</a></li><li class='nav-item ' role="presentation"><a class='nav-link ' style="" data-toggle="tab" aria-controls='tabs-fc643770a31c963bbdf2df03ca040bd6211' role="tab" data-target='#tabs-fc643770a31c963bbdf2df03ca040bd6211'>**C++**</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-b9447a56f4bcd675e4bdfc0a84c9b5a4510' class="tab-pane fade active in"> ```python from typing import List # 树状数组(区间和版) class BinaryIndexedTree: __slots__ = 'tree' def __init__(self, n: int): self.tree: List[int] = [0] * n # 获取x,2进制数最低位1的位置 def lowbit(self, x: int) -> int: return x & (-x) # 在下标i处加上val def insert(self, i: int, val: int) -> None: while i < len(self.tree): # 更新所有相关值 # self.tree[i] = max(self.tree[i], val) self.tree[i] += val i += self.lowbit(i) # 查询[0, i]区间和 def query(self, i: int) -> int: ans = 0 while i > 0: # ans = max(ans, self.tree[i]) ans += self.tree[i] i -= self.lowbit(i) # i &= i - 1 等价于 i -= self.lowbit(i) return ans ``` </div><div role="tabpanel" id='tabs-fc643770a31c963bbdf2df03ca040bd6211' class="tab-pane fade "> ```cpp ``` </div> </div> </div> # KMP <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-5f4e9dc09cea60a565e91bb572ea2f889" aria-expanded="true"><div class="accordion-toggle"><span style="">**相关例题**</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-5f4e9dc09cea60a565e91bb572ea2f889" class="collapse collapse-content"><p></p> <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-81691fcf10a97e982be920e4d00df117560' role="tab" data-target='#tabs-81691fcf10a97e982be920e4d00df117560'>**力扣**</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-81691fcf10a97e982be920e4d00df117560' class="tab-pane fade active in"> [100207. 找出数组中的美丽下标 II](https://leetcode.cn/problems/find-beautiful-indices-in-the-given-array-ii/) </div> </div> </div> <p></p></div></div></div> --- <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-0efd6afb72064f6e51ea7d78a04a576c560' role="tab" data-target='#tabs-0efd6afb72064f6e51ea7d78a04a576c560'>**Python3**</a></li><li class='nav-item ' role="presentation"><a class='nav-link ' style="" data-toggle="tab" aria-controls='tabs-06d203be10b46529f54173fec765b55241' role="tab" data-target='#tabs-06d203be10b46529f54173fec765b55241'>**C++**</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-0efd6afb72064f6e51ea7d78a04a576c560' class="tab-pane fade active in"> ```python from typing import List def kmp(text: str, pattern: str) -> List[int]: m = len(pattern) pi = [0] * m c = 0 for i in range(1, m): v = pattern[i] while c and pattern[c] != v: c = pi[c - 1] if pattern[c] == v: c += 1 pi[i] = c res = [] c = 0 for i, v in enumerate(text): v = text[i] while c and pattern[c] != v: c = pi[c - 1] if pattern[c] == v: c += 1 if c == len(pattern): res.append(i - m + 1) c = pi[c - 1] return res ``` </div><div role="tabpanel" id='tabs-06d203be10b46529f54173fec765b55241' class="tab-pane fade "> ```cpp ``` </div> </div> </div> # 数位DP <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-bc393b9f93cebd4eaaa850e7aeb8cef281" aria-expanded="true"><div class="accordion-toggle"><span style="">**相关例题**</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-bc393b9f93cebd4eaaa850e7aeb8cef281" class="collapse collapse-content"><p></p> <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-fad035cde29ec936d33af60f5a89966a500' role="tab" data-target='#tabs-fad035cde29ec936d33af60f5a89966a500'>**力扣**</a></li><li class='nav-item ' role="presentation"><a class='nav-link ' style="" data-toggle="tab" aria-controls='tabs-785e668b353a58499edff3c917f2daa4711' role="tab" data-target='#tabs-785e668b353a58499edff3c917f2daa4711'>**AcWing**</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-fad035cde29ec936d33af60f5a89966a500' class="tab-pane fade active in"> [2999. 统计强大整数的数目](https://leetcode.cn/problems/count-the-number-of-powerful-integers/) </div><div role="tabpanel" id='tabs-785e668b353a58499edff3c917f2daa4711' class="tab-pane fade "> [338.计数问题](https://www.acwing.com/problem/content/340/) </div> </div> </div> <p></p></div></div></div> --- <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-934099db59eec3f59da113bc549edacf600' role="tab" data-target='#tabs-934099db59eec3f59da113bc549edacf600'>**Python3**</a></li><li class='nav-item ' role="presentation"><a class='nav-link ' style="" data-toggle="tab" aria-controls='tabs-1f8565f8b4ff306c5082d88a7a12d257761' role="tab" data-target='#tabs-1f8565f8b4ff306c5082d88a7a12d257761'>**C++**</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-934099db59eec3f59da113bc549edacf600' class="tab-pane fade active in"> ```python import functools from typing import List # i:表示枚举到第i位,这里从高位到低位枚举,最高位为0; # cnt:统计数字0-9出现的个数,如果只需要统计某一个数字,可改成int; # is_preamble:用来判断当前的0是不是前导0,如果不需要统计0可以删除; # limit_low:用来判断是否受到start的约束,因为构造的数字不能小于start # limit_high:用来判断是否受到end的约束,因为构造的数字不能大于end @functools.lru_cache(maxsize=None) # 统计[start, end]区间内0-9这10个数字出现的次数。 def f(i: int, cnt: tuple, is_preamble: bool, limit_low: bool, limit_high: bool) -> List[int]: nonlocal n, start, end if i == n: return cnt res = [0] * 10 lo = int(start[i]) if limit_low else 0 hi = int(end[i]) if limit_high else 9 cnt = list(cnt) for d in range(lo, hi + 1): cnt[d] += 0 if is_preamble and d == 0 else 1 temp = f(i + 1, tuple(cnt), is_preamble and d == 0, limit_low and d == lo, limit_high and d == hi) for j in range(10): res[j] += temp[j] cnt[d] -= 0 if is_preamble and d == 0 else 1 return res ``` </div><div role="tabpanel" id='tabs-1f8565f8b4ff306c5082d88a7a12d257761' class="tab-pane fade "> ```cpp ``` </div> </div> </div> Last modification:January 14, 2024 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 9 看着给点?(●'◡'●)?