Skip to content

Commit f27b9ac

Browse files
committed
补充了数论、高等数学、杂项;增加了博弈论、字符串、计算几何、线性代数和概率论、动态规划内容
1 parent a4fc515 commit f27b9ac

17 files changed

Lines changed: 8813 additions & 4882 deletions

README.md

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,36 +31,30 @@
3131
- 22/03/24
3232
- 开始模板编制工作
3333
- 增加部分数学公式、大部分 STL 内容
34-
3534
- 22/03/25
3635
- 补充 STL 内容
3736
- 增加排序、组合数学、快读快写、高精度、树
38-
3937
- 22/03/26
4038
- 补充树内容
4139
- 增加线段树、树状数组、平衡树等数据类型
42-
4340
- 22/03/28
4441
- 增加加权并查集内容
45-
4642
- 22/03/29
4743
- 增加整体二分、LIS、前缀和/差分内容
4844
- 增加了搜索、二分答案内容
49-
5045
- 22/03/30
5146
- 增加了zkw线段树、猫树、K-D Tree内容,修改了部分内容
5247
- 增加了图概念、最短路内容
53-
5448
- 22/03/31
5549
- 增加了拓扑排序、最小生成树、二分图匹配、网络流内容
56-
5750
- 22/04/01
58-
5951
- 增加了图的连通性、组合数学、数学杂项内容
6052

6153
- 22/04/02
62-
6354
- 增加了数论主要内容、高等数学内容
6455

65-
56+
- 22/04/03
57+
- 补充了数论、高等数学、杂项内容
58+
- 增加了博弈论、字符串、计算几何、线性代数和概率论、动态规划内容
59+
6660

code/kmp.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include <bits/stdc++.h> //题目https://oj.socoding.cn/p/1713
2+
using namespace std;
3+
typedef long long ll;
4+
#define mn 2000010
5+
char s[mn], t[mn];
6+
ll kmp[mn], ns, nt, cnt;
7+
signed main()
8+
{
9+
scanf("%s%s", s + 1, t + 1);
10+
ns = strlen(s + 1), nt = strlen(t + 1);
11+
for (ll i = 2, j = 0; i <= nt; ++i)
12+
{
13+
while (j > 0 && t[j + 1] != t[i])
14+
{
15+
j = kmp[j];
16+
}
17+
if (t[j + 1] == t[i])
18+
{
19+
++j;
20+
}
21+
kmp[i] = j;
22+
}
23+
for (ll i = 1, j = 0; i <= ns; ++i)
24+
{
25+
while (j > 0 && t[j + 1] != s[i])
26+
{
27+
j = kmp[j];
28+
}
29+
if (t[j + 1] == s[i])
30+
{
31+
++j;
32+
}
33+
if (j == nt)
34+
{
35+
++cnt;
36+
printf("%lld ", i - j + 1);
37+
j = kmp[j];
38+
}
39+
}
40+
if (cnt == 0)
41+
{
42+
printf("-1");
43+
}
44+
return 0;
45+
}

code/p1368_minimal_string.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ll;
4+
ll n, ans, a[300002], i, j = 1, k;
5+
signed main()
6+
{
7+
scanf("%lld", &n);
8+
for(ll i=0;i<n;++i) scanf("%lld", a + i);
9+
while (i < n && j < n && k < n)
10+
{
11+
if (a[(i + k) % n] == a[(j + k) % n]) ++k;
12+
else
13+
{
14+
if (a[(i + k) % n] > a[(j + k) % n]) i += k + 1;
15+
else j += k + 1;
16+
if (i == j) ++i;
17+
k = 0;
18+
}
19+
}
20+
ans = min(i, j);
21+
for(ll i=0;i<n;++i) printf("%lld ", a[(i + ans) % n]);
22+
return 0;
23+
}

code/p1495_CRT.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ll;
4+
#define mn 13
5+
ll n, a[mn], b[mn], pd = 1, c, ci, z, ans;
6+
void exgcd(ll a, ll b, ll &x, ll &y)
7+
{
8+
if (!b)
9+
x = 1, y = 0;
10+
else
11+
exgcd(b, a % b, y, x), y -= a / b * x;
12+
}
13+
signed main()
14+
{
15+
scanf("%lld", &n);
16+
for (ll i = 1; i <= n; ++i)
17+
{
18+
scanf("%lld%lld", &a[i], &b[i]);
19+
pd *= a[i];
20+
}
21+
for (ll i = 1; i <= n; ++i)
22+
{
23+
c = pd / a[i], z = 0, ci = 0;
24+
exgcd(c, a[i], ci, z);
25+
ans += b[i] * c * ((ci + a[i]) % a[i]);
26+
}
27+
printf("%lld", ans % pd);
28+
return 0;
29+
}

code/p3803_fft.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ll;
4+
typedef double db;
5+
#define mn ((1 << 21) + 1)
6+
ll n1, n2, rev[mn], ans[mn], k, s = 1, len, n;
7+
db pi = acos(-1), v;
8+
typedef complex<db> cp;
9+
cp a[mn], b[mn];
10+
void fft(cp *a, ll n, ll flag)
11+
{
12+
for (ll i = 0; i < n; ++i)
13+
{
14+
if (i < rev[i])
15+
{
16+
swap(a[i], a[rev[i]]);
17+
}
18+
}
19+
for (ll h = 1; h < n; h <<= 1)
20+
{
21+
cp wn = exp(cp(0, flag * pi / h));
22+
for (ll j = 0; j < n; j += h << 1)
23+
{
24+
cp w(1, 0);
25+
for (ll k = j; k < j + h; ++k)
26+
{
27+
cp x = a[k], y = w * a[k + h];
28+
a[k] = x + y;
29+
a[k + h] = x - y;
30+
w *= wn;
31+
}
32+
}
33+
}
34+
if (flag == -1)
35+
{
36+
for (ll i = 0; i < n; ++i)
37+
{
38+
a[i] /= n;
39+
}
40+
}
41+
}
42+
#pragma GCC diagnostic ignored "-Wformat" //忽略db转complex警告
43+
signed main()
44+
{
45+
scanf("%lld%lld", &n1, &n2), n = n1 + n2;
46+
for (ll i = 0; i <= n1; ++i)
47+
{
48+
scanf("%lf", a + i);
49+
}
50+
for (ll i = 0; i <= n2; ++i)
51+
{
52+
scanf("%lf", b + i);
53+
}
54+
while (s <= n)
55+
{
56+
s <<= 1, ++k;
57+
}
58+
for (ll i = 0; i < s; ++i)
59+
{
60+
rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (k - 1));
61+
}
62+
fft(a, s, 1), fft(b, s, 1);
63+
for (ll i = 0; i <= s; ++i)
64+
{
65+
a[i] *= b[i];
66+
}
67+
fft(a, s, -1);
68+
for (ll i = 0; i <= n; ++i)
69+
{
70+
printf("%lld ", (ll)(a[i].real() + 0.5));
71+
}
72+
return 0;
73+
}

code/p3805_manacher.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
#define mn 22000010
4+
char s[mn], ch;
5+
int p[mn], n, ans, r, c;
6+
signed main()
7+
{
8+
s[0] = '#', s[++n] = '#';
9+
while (EOF != (ch = getchar()))
10+
{
11+
s[++n] = ch, s[++n] = '#';
12+
}
13+
for (int i = 1; i <= n; ++i)
14+
{
15+
if (i <= r)
16+
{
17+
p[i] = min(p[c * 2 - i], r - i + 1);
18+
}
19+
while (s[i + p[i]] == s[i - p[i]])
20+
{
21+
++p[i];
22+
}
23+
if (i + p[i] > r)
24+
{
25+
r = p[i] + i - 1, c = i;
26+
}
27+
ans = max(ans, p[i]);
28+
}
29+
printf("%d", ans - 1);
30+
return 0;
31+
}

code/p3808_ac_automaton.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ll;
4+
#define sc(x) scanf("%lld", &x)
5+
#define mn 1000010
6+
int tr[mn][26], cnt, e[mn], fail[mn];
7+
ll n, ans;
8+
char s[mn];
9+
queue<int> q;
10+
signed main()
11+
{
12+
sc(n);
13+
for (ll i = 1; i <= n; ++i)
14+
{
15+
scanf("%s", s + 1);
16+
int u = 0;
17+
for (int i = 1; s[i]; ++i)
18+
{
19+
int a = s[i] - 'a';
20+
if (!tr[u][a])
21+
{
22+
tr[u][a] = ++cnt;
23+
}
24+
u = tr[u][a];
25+
}
26+
++e[u];
27+
}
28+
for (ll i = 0; i < 26; ++i)
29+
{
30+
if (tr[0][i])
31+
{
32+
q.push(tr[0][i]);
33+
}
34+
}
35+
while (!q.empty())
36+
{
37+
int u = q.front();
38+
q.pop();
39+
for (int i = 0; i < 26; ++i)
40+
{
41+
if (tr[u][i])
42+
{
43+
fail[tr[u][i]] = tr[fail[u]][i];
44+
q.push(tr[u][i]);
45+
}
46+
else
47+
{
48+
tr[u][i] = tr[fail[u]][i];
49+
}
50+
}
51+
}
52+
scanf("%s", s + 1);
53+
int u = 0;
54+
for (int i = 1; s[i]; ++i)
55+
{
56+
int a = s[i] - 'a';
57+
u = tr[u][a];
58+
for (int j = u; j && e[j] != -1; j = fail[j])
59+
{
60+
ans += e[j], e[j] = -1;
61+
}
62+
}
63+
printf("%lld", ans);
64+
return 0;
65+
}

code/p3809_suffix_array.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ll;
4+
#define mn 1000010
5+
char s[mn];
6+
ll n, sa[mn], rk[mn], oldrk[mn << 1], id[mn], px[mn], cnt[mn];
7+
bool cmp(ll x, ll y, ll w)
8+
{
9+
return oldrk[x] == oldrk[y] && oldrk[x + w] == oldrk[y + w];
10+
}
11+
ll m = 300, i, p, w; //ASCII范围<300为计数排序值域,p是新值域
12+
signed main()
13+
{
14+
scanf("%s", s + 1), n = strlen(s + 1);
15+
for (ll i = 1; i <= n; ++i)
16+
{ //暂时以第一关键字为排序值,有很多同名并列
17+
++cnt[rk[i] = s[i]];
18+
}
19+
for (ll i = 1; i <= m; ++i)
20+
{
21+
cnt[i] += cnt[i - 1];
22+
}
23+
for (ll i = n; i >= 1; --i)
24+
{
25+
sa[cnt[rk[i]]--] = i;
26+
}
27+
for (w = 1;; w <<= 1, m = p)
28+
{
29+
for (p = 0, i = n; i > n - w; --i)
30+
{ //第二关键字排序;无穷小区域
31+
id[++p] = i;
32+
}
33+
for (ll i = 1; i <= n; ++i)
34+
{
35+
if (sa[i] > w)
36+
{
37+
id[++p] = sa[i] - w;
38+
}
39+
}
40+
memset(cnt, 0, sizeof cnt);
41+
for (ll i = 1; i <= n; ++i) //第一关键字排序
42+
{
43+
++cnt[px[i] = rk[id[i]]];
44+
}
45+
for (ll i = 1; i <= m; ++i)
46+
{
47+
cnt[i] += cnt[i - 1];
48+
}
49+
for (ll i = n; i >= 1; --i)
50+
{
51+
sa[cnt[px[i]]--] = id[i];
52+
}
53+
memcpy(oldrk, rk, sizeof rk);
54+
for (p = 0, i = 1; i <= n; ++i)
55+
{
56+
rk[sa[i]] = cmp(sa[i], sa[i - 1], w) ? p : ++p;
57+
}
58+
if (p == n)
59+
{
60+
for (ll i = 1; i <= n; ++i)
61+
{
62+
sa[rk[i]] = i;
63+
}
64+
break;
65+
}
66+
}
67+
for (ll i = 1; i <= n; ++i)
68+
{
69+
printf("%lld ", sa[i]);
70+
}
71+
return 0;
72+
}

0 commit comments

Comments
 (0)