@@ -1756,16 +1756,237 @@ FixNamespaceComments: false
1756
1756
],
1757
1757
"description" : " 最小费用流"
1758
1758
},
1759
- "莫队查询排序 " : {
1760
- "prefix" : " tpmo " ,
1759
+ "莫队算法 " : {
1760
+ "prefix" : " tpmoalgo " ,
1761
1761
"body" : [
1762
- " struct Query" ,
1762
+ " template <class G, class A, void (*op)(G &, int, bool), A (*answer)(const G &)>" ,
1763
+ " class MoAlgo" ,
1763
1764
" {" ,
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;" ,
1766
1807
" };"
1767
1808
],
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"
1769
1990
},
1770
1991
"布尔矩阵" : {
1771
1992
"prefix" : " tpmatrix" ,
@@ -1819,36 +2040,6 @@ FixNamespaceComments: false
1819
2040
],
1820
2041
"description" : " 布尔矩阵"
1821
2042
},
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
- },
1852
2043
}
1853
2044
```
1854
2045
0 commit comments