Skip to content

Commit 7308e2d

Browse files
committed
update cpp template documentation
1 parent 991fd7b commit 7308e2d

File tree

1 file changed

+227
-36
lines changed

1 file changed

+227
-36
lines changed

docs/algorithm/cpp_templete.md

Lines changed: 227 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)