C++万能头文件
#include <bits/stdc++.h>
长整型重命名
typedef long long ll;
求高精度圆周率 Pi
const double Pi = atan(1.0) * 4;
并查集
int father[1024];
int init(int n) {
for (int i = 0; i < n; i++) {
father[i] = i;
}
}
int getFather(int root) {
int origin = root;
while (father[root] != root) {
root = father[root];
}
while (origin != root) {
int temp = father[origin];
father[origin] = root;
origin = temp;
}
return root;
}
int join(int root1, int root2) {
int a = getFather(root1);
int b = getFather(root2);
if (a != b) {
father[a] = b;
}
}
最长上升子序列
int LIS(vector<int> arr) {
int res = 1;
int dp[1010];
for (int i = 0; i < arr.size(); i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (arr[i] > arr[j]) {
dp[i] = (dp[i], dp[j] + 1);
}
if (dp[i] > res) {
res = dp[i];
}
}
}
return res;
}
快速幂
const int mod = 1000;
ll fast_pow(ll base, ll pow) {
ll res = 1;
while (pow > 0) {
if (pow & 1 == 1) {
res = (res * base) % mod;
}
pow >>= 1;
base = (base * base) % mod;
}
return res;
}
求两个数的最大公约数(辗转相除法)
int gck(int a, int b) {
while (a % b > 0) {
int temp = a % b;
a = b;
b = temp;
}
return b;
}
求一个字符串的全排列(递归)
void perm(string str, int start) {
if (start == str.size() - 1) {
cout << str << endl;
return ;
} else {
for (int i = start; i < str.size(); i++) {
swap(str[i], str[start]);
perm(str, start + 1);
swap(str[i], str[start]);
}
}
}
求一个字符串的所有子串
void printAllSon(string str) {
for (int i = 0; i < str.size(); i++) {
for (int j = 0; j < str.size() - i; j++) {
string son = str.substr(i, j + 1);
cout << son << endl;
}
}
}
二分查找
int binSearchOf(vector<int> &arr, int val) {
int low = 0, high = arr.size() - 1, mid;
bool isFind = false;
while (low <= high) {
mid = (high + low) / 2;
if (arr[mid] < val) {
low = mid + 1;
} else if (arr[mid] > val) {
high = mid - 1;
} else {
isFind = true;
break;
}
}
return isFind ? mid : -1;
}
判断闰年
bool isLeap(int year) {
bool isRight = true;
if (year % 4 != 0) {
isRight = false;
}
if (year % 100 == 0 && year % 400 != 0) {
isRight = false;
}
return isRight;
}
将字符串中包含的某个字符全部替换为新字符
void updateChTo(string &str, char oldCh, char newCh) {
int pos;
string goal(1, newCh);
pos = str.find(oldCh);
while (pos != str.npos) {
str.replace(pos, 1, goal);
pos = str.find(oldCh);
}
}
图的遍历(BFS | DFS)
void BFS(vector<vector<int> > mat, int startX, int startY) {
int cx[] = {0, 0, -1, 1};
int cy[] = {-1, 1, 0, 0};
queue<pair<int, int> > q;
mat[startX][startY] = 1;
q.push({startX, startY});
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int nx = x + cx[i];
int ny = y + cy[i];
if (nx >= 0 && nx < mat.size() && ny >= 0 && ny < mat[0].size() && mat[nx][ny] != 1) {
mat[nx][ny] = 1;
q.push({nx, ny});
}
}
}
}
void DFS(vector<vector<int> > mat, int x, int y, vector<vector<int> > visited) {
int cx[] = {0, 0, -1, 1};
int cy[] = {-1, 1, 0, 0};
for (int i = 0; i < 4; i++) {
int nx = x + cx[i];
int ny = y + cy[i];
if (nx >= 0 && nx < mat.size() && ny >= 0 && ny < mat[0].size() && visited[nx][ny] != 1) {
visited[nx][ny] = 1;
DFS(mat, nx, ny, visited);
}
}
}
两个字符串的最长公共子序列 — LCS(动态规划)
int LCS(string str1, string str2) {
int row = str1.size() + 1;
int column = str2.size() + 1;
int dp[row][column];
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
dp[i][j] = 0;
}
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < column; j++) {
if (str1[i - 1] == str2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
return dp[row - 1][column - 1];
}
持续更新。