@@ -1756,16 +1756,237 @@ FixNamespaceComments: false
17561756 ],
17571757 "description" : " 最小费用流"
17581758 },
1759- "莫队查询排序 " : {
1760- "prefix" : " tpmo " ,
1759+ "莫队算法 " : {
1760+ "prefix" : " tpmoalgo " ,
17611761 "body" : [
1762- " struct Query" ,
1762+ " template <class G, class A, void (*op)(G &, int, bool), A (*answer)(const G &)>" ,
1763+ " class MoAlgo" ,
17631764 " {" ,
1764- " int l, r, b, id;" ,
1765- " bool operator<(const Query &other) const { return b != other.b ? b < other.b : (r == other.r ? false : ((b & 1) ^ (r < other.r))); }" ,
1765+ " public:" ,
1766+ " explicit MoAlgo(int n, G g, const vector<pair<int, int>> &intervals) : n(n), m(intervals.size()), g(g)" ,
1767+ " {" ,
1768+ " int sq = sqrt(n);" ,
1769+ " query.reserve(m);" ,
1770+ " for (int i = 0; i < m; i++)" ,
1771+ " {" ,
1772+ " auto [l, r] = intervals[i];" ,
1773+ " query.push_back({l, r, l / sq, i});" ,
1774+ " }" ,
1775+ " sort(query.begin(), query.end());" ,
1776+ " }" ,
1777+ " " ,
1778+ " vector<A> solve()" ,
1779+ " {" ,
1780+ " vector<A> ans(m);" ,
1781+ " int l = 0, r = 0;" ,
1782+ " for (auto &[ql, qr, _, id] : query)" ,
1783+ " {" ,
1784+ " while (l > ql)" ,
1785+ " op(g, --l, true);" ,
1786+ " while (r < qr)" ,
1787+ " op(g, r++, true);" ,
1788+ " while (l < ql)" ,
1789+ " op(g, l++, false);" ,
1790+ " while (r > qr)" ,
1791+ " op(g, --r, false);" ,
1792+ " ans[id] = answer(g);" ,
1793+ " }" ,
1794+ " return ans;" ,
1795+ " }" ,
1796+ " " ,
1797+ " private:" ,
1798+ " struct Query" ,
1799+ " {" ,
1800+ " int l, r, b, id;" ,
1801+ " bool operator<(const Query &other) const { return b != other.b ? b < other.b : (b & 1) ^ (r < other.r); }" ,
1802+ " };" ,
1803+ " " ,
1804+ " int n, m;" ,
1805+ " G g;" ,
1806+ " vector<Query> query;" ,
17661807 " };"
17671808 ],
1768- "description" : " 莫队查询排序"
1809+ "description" : " 莫队算法"
1810+ },
1811+ "manacher算法" : {
1812+ "prefix" : " tpmanacher" ,
1813+ "body" : [
1814+ " int manacher(const string &s, char ch)" ,
1815+ " {" ,
1816+ " int n = s.size();" ,
1817+ " int m = 2 * n + 1;" ,
1818+ " string t(m, ch);" ,
1819+ " for (int i = 0, j = 1; i < n; i++, j += 2)" ,
1820+ " t[j] = s[i];" ,
1821+ " vector<int> d(m);" ,
1822+ " int ans = 0;" ,
1823+ " for(int i = 0, l = 0, r = -1; i < m; i++)" ,
1824+ " {" ,
1825+ " int k = i > r ? 1 : min(d[l+r-i], r-i+1);" ,
1826+ " while(i-k >= 0 && i + k < m && t[i-k] == t[i+k])" ,
1827+ " k++;" ,
1828+ " d[i] = k;" ,
1829+ " ans = max(ans, 2 * k - 1);" ,
1830+ " if(i + k - 1 > r)" ,
1831+ " {" ,
1832+ " r = i + k - 1;" ,
1833+ " l = i - k + 1;" ,
1834+ " }" ,
1835+ " }" ,
1836+ " return ans / 2;" ,
1837+ " }"
1838+ ],
1839+ "description" : " manacher算法"
1840+ },
1841+ "KMP" : {
1842+ "prefix" : " tpkmp" ,
1843+ "body" : [
1844+ " vector<int> get_next(const string &s)" ,
1845+ " {" ,
1846+ " int n = s.size();" ,
1847+ " vector<int> next(n);" ,
1848+ " for (int i = 1, j = 0; i < n; i++)" ,
1849+ " {" ,
1850+ " while (j && s[i] != s[j])" ,
1851+ " j = next[j - 1];" ,
1852+ " if (s[i] == s[j])" ,
1853+ " j++;" ,
1854+ " next[i] = j;" ,
1855+ " }" ,
1856+ " return next;" ,
1857+ " }" ,
1858+ " "
1859+ ],
1860+ "description" : " KMP"
1861+ },
1862+ "modint" : {
1863+ "prefix" : " tpmint" ,
1864+ "body" : [
1865+ " template <int m, bool isp = true>" ,
1866+ " class static_modint" ,
1867+ " {" ,
1868+ " using mint = static_modint;" ,
1869+ " using u32 = unsigned int;" ,
1870+ " using u64 = unsigned long long;" ,
1871+ " using i32 = int;" ,
1872+ " using i64 = long long;" ,
1873+ " " ,
1874+ " public:" ,
1875+ " static_modint() : _v(0) {}" ,
1876+ " static_modint(u32 v) : _v(v % umod()) {}" ,
1877+ " static_modint(u64 v) : _v(v % umod()) {}" ,
1878+ " static_modint(i32 v)" ,
1879+ " {" ,
1880+ " i32 x = (i32)(v % (i32)umod());" ,
1881+ " if (x < 0)" ,
1882+ " x += umod();" ,
1883+ " _v = (u32)x;" ,
1884+ " }" ,
1885+ " static_modint(i64 v)" ,
1886+ " {" ,
1887+ " i64 x = (i64)(v % (i64)umod());" ,
1888+ " if (x < 0)" ,
1889+ " x += umod();" ,
1890+ " _v = (u32)x;" ,
1891+ " }" ,
1892+ " " ,
1893+ " u32 val() const { return _v; }" ,
1894+ " " ,
1895+ " mint &operator++()" ,
1896+ " {" ,
1897+ " _v++;" ,
1898+ " if (_v == umod())" ,
1899+ " _v = 0;" ,
1900+ " return *this;" ,
1901+ " }" ,
1902+ " mint &operator--()" ,
1903+ " {" ,
1904+ " if (_v == 0)" ,
1905+ " _v = umod();" ,
1906+ " _v--;" ,
1907+ " return *this;" ,
1908+ " }" ,
1909+ " mint operator++(int)" ,
1910+ " {" ,
1911+ " mint result = *this;" ,
1912+ " ++*this;" ,
1913+ " return result;" ,
1914+ " }" ,
1915+ " mint operator--(int)" ,
1916+ " {" ,
1917+ " mint result = *this;" ,
1918+ " --*this;" ,
1919+ " return result;" ,
1920+ " }" ,
1921+ " " ,
1922+ " mint &operator+=(const mint &rhs)" ,
1923+ " {" ,
1924+ " _v += rhs._v;" ,
1925+ " if (_v >= umod())" ,
1926+ " _v -= umod();" ,
1927+ " return *this;" ,
1928+ " }" ,
1929+ " mint &operator-=(const mint &rhs)" ,
1930+ " {" ,
1931+ " _v -= rhs._v;" ,
1932+ " if (_v >= umod())" ,
1933+ " _v += umod();" ,
1934+ " return *this;" ,
1935+ " }" ,
1936+ " mint &operator*=(const mint &rhs)" ,
1937+ " {" ,
1938+ " u64 z = (u64)_v * (u64)rhs._v;" ,
1939+ " _v = (u32)(z % umod());" ,
1940+ " return *this;" ,
1941+ " }" ,
1942+ " mint &operator/=(const mint &rhs) { return *this = *this * rhs.inv(); }" ,
1943+ " " ,
1944+ " mint operator+() const { return *this; }" ,
1945+ " mint operator-() const { return mint(0) - *this; }" ,
1946+ " " ,
1947+ " mint pow(i64 n) const" ,
1948+ " {" ,
1949+ " mint x = *this, r = 1;" ,
1950+ " while (n)" ,
1951+ " {" ,
1952+ " if (n & 1)" ,
1953+ " r *= x;" ,
1954+ " x *= x;" ,
1955+ " n >>= 1;" ,
1956+ " }" ,
1957+ " return r;" ,
1958+ " }" ,
1959+ " " ,
1960+ " mint inv() const { return isp ? pow(umod() - 2) : inv_gcd(_v, m); }" ,
1961+ " " ,
1962+ " friend mint operator+(const mint &lhs, const mint &rhs) { return mint(lhs) += rhs; }" ,
1963+ " friend mint operator-(const mint &lhs, const mint &rhs) { return mint(lhs) -= rhs; }" ,
1964+ " friend mint operator*(const mint &lhs, const mint &rhs) { return mint(lhs) *= rhs; }" ,
1965+ " friend mint operator/(const mint &lhs, const mint &rhs) { return mint(lhs) /= rhs; }" ,
1966+ " friend bool operator==(const mint &lhs, const mint &rhs) { return lhs._v == rhs._v; }" ,
1967+ " friend bool operator!=(const mint &lhs, const mint &rhs) { return lhs._v != rhs._v; }" ,
1968+ " " ,
1969+ " private:" ,
1970+ " u32 _v;" ,
1971+ " " ,
1972+ " static constexpr unsigned int umod() { return m; }" ,
1973+ " " ,
1974+ " static mint inv_gcd(i64 a, i64 b)" ,
1975+ " {" ,
1976+ " auto exgcd = [](auto &&self, i64 a, i64 b) -> pair<i64, i64>" ,
1977+ " {" ,
1978+ " if (b == 0)" ,
1979+ " return {1, 0};" ,
1980+ " auto [x, y] = self(self, b, a % b);" ,
1981+ " return {y, x - a / b * y};" ,
1982+ " };" ,
1983+ " " ,
1984+ " auto [x, _] = exgcd(exgcd, a, b);" ,
1985+ " return mint(x);" ,
1986+ " }" ,
1987+ " };"
1988+ ],
1989+ "description" : " modint"
17691990 },
17701991 "布尔矩阵" : {
17711992 "prefix" : " tpmatrix" ,
@@ -1819,36 +2040,6 @@ FixNamespaceComments: false
18192040 ],
18202041 "description" : " 布尔矩阵"
18212042 },
1822- "manacher算法" : {
1823- "prefix" : " tpmanacher" ,
1824- "body" : [
1825- " int manacher(const string &s, char ch)" ,
1826- " {" ,
1827- " int n = s.size();" ,
1828- " int m = 2 * n + 1;" ,
1829- " string t(m, ch);" ,
1830- " for (int i = 0, j = 1; i < n; i++, j += 2)" ,
1831- " t[j] = s[i];" ,
1832- " vector<int> d(m);" ,
1833- " int ans = 0;" ,
1834- " for(int i = 0, l = 0, r = -1; i < m; i++)" ,
1835- " {" ,
1836- " int k = i > r ? 1 : min(d[l+r-i], r-i+1);" ,
1837- " while(i-k >= 0 && i + k < m && t[i-k] == t[i+k])" ,
1838- " k++;" ,
1839- " d[i] = k;" ,
1840- " ans = max(ans, 2 * k - 1);" ,
1841- " if(i + k - 1 > r)" ,
1842- " {" ,
1843- " r = i + k - 1;" ,
1844- " l = i - k + 1;" ,
1845- " }" ,
1846- " }" ,
1847- " return ans / 2;" ,
1848- " }"
1849- ],
1850- "description" : " manacher算法"
1851- },
18522043}
18532044```
18542045
0 commit comments