模板库 ~ Template library
已精炼 .
bashrc
title x
:设置标题为x
compile x
:编译x.cpp
并写入到可执行文件x
compilerun x
:compile x
并运行x
基于 NOI Linux 相关内容 . 有常用 alias .
case $- in
*i*) ;;
*) return;;
esac
HISTCONTROL=ignoreboth
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=2000
shopt -s checkwinsize
# shopt -s globstar
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
# force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
color_prompt=yes
else
color_prompt=
fi
fi
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
# sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
[ -r /home/hzoi/.byobu/prompt ] && . /home/hzoi/.byobu/prompt #byobu-prompt#
# ------------------------------ ABOUT OI ------------------------------
function title() {
if [[ -z "$ORIG" ]]; then
ORIG=$PS1
fi
TITLE="\[\e]2;$*\a\]"
PS1=${ORIG}${TITLE}
}
compile() {
g++ $1.cpp -lm -O2 -Wall -Wextra -fconcepts -std=c++14 -Wno-unused-result -fsanitize=address,undefined -o $1
}
compilefst() {
g++ $1.cpp -lm -O2 -Wall -Wextra -fconcepts -std=c++14 -Wno-unused-result -o $1
}
compilerun() {
compile $1 && time ./$1
}
compilerunfst() {
compilefst $1
time ./$1
}
fc() {
diff -BZbs --color=always --strip-trailing-cr --suppress-common-lines $1 $2
}
alias cr='compilerun'
alias crf='compilerunfst'
alias cls='clear'
alias clr='clear'
alias hc='history -c'
alias hcs='clear && history -c'
alias python='python3'
alias calc='gnome-calculator'
alias screenshot='gnome-screenshot'
相关 Bash 命令:
source ~/.bashrc
:快速应用 bashrcalias x=y
:设置y
的别名为x
,等号没有空格 .unalias x
:取消x
这个别名
nanorc
注意反人类 nano 的快捷键
nano 快捷键
- 保存:
Ctrl + O
保存 . - 复制一整行:
Alt + 6
- 剪贴一整行:
Ctrl + K
- 复制/剪贴多行或者一行中的一部分:先将光标移动到需要复制/剪贴的文本的开头,按
Ctrl + 6
或Alt + A
做标记,然后移动光标到待复制/剪贴的文本末尾 . 这时选定的文本会反白,然后按复制一行的方法复制 .Ctrl + 6
取消 . - 粘贴:
Ctrl + U
- 搜索:
Ctrl + W
然后输入搜索单词,Alt + W
跳转下一个 - 退出:
Ctrl + X
,然后输入Y
表示保存修改,N
不保存 .Ctrl + C
取消 .
Ref. https://zhuanlan.zhihu.com/p/259380222 .
set tabsize 4 # 设置制表符宽度
set autoindent # 允许自动缩进
set cut # 设置 CTRL-K 可以剪贴到行末
set noconvert # 不要转换 DOS/UNIX 换行符
set nowrap # 不要自动换行
set nohelp # 不显示下面两行帮助 (Alt+X 显示)
set morespace # 隐藏标题下的空白行,换取更多编辑空间
set smooth # 平滑卷屏
set suspend # 允许 ctrl-z 将 nano 置于后台
set smarthome # 第一次 Home 跳到行首非空字符,第二次到行首
set tabstospaces # 展开制表符为空格(如果需要的话)
set mouse # 允许鼠标
# set linenumbers # 显示行号(可以在编辑时 ALT-# 切换),NOI Linux 1.0 的 nano 太旧了不支持!
set backupdir path # 设置备份路径
set backup # 允许保存备份
set casesensitive # 搜索使用大小写敏感
set multibuffer # 使用 CTRL-r 读取文件时,默认读取到新缓存
set nonewlines # 不在文件末尾添加新行
pool (Mixed)
接口:
构建 pool : T -> unsigned
的映射 .
若 \(M\) 为 pool<T>
类型变量,满足若 \(x\neq y\),则 \(\operatorname{get}(x)\neq\operatorname{get}(y)\) .
template<typename T>
class pool
{
unordered_map<T, unsigned> pol;
unsigned cc;
public:
pool(){cc = 0;}
~pool() = default;
unsigned get(T x)
{
auto ptr = pol.find(x);
if (ptr == pol.end()){pol[x] = ++cc; return cc;}
else return ptr -> second;
}
unsigned size() const {return cc;}
void clear(){cc = 0; pol.clear();}
};
光速幂(底数不变 O(1) 求幂)
// 值域 2^31-1
template <const int MOD>
struct FastPow
{
private:
int p1[66666], p2[66666];
static int qpow(int a, int n){/**/}
public:
explicit FastPow(int a)
{
ll t1 = a, t2 = qpow(t1,65536); p1[0] = p2[0] = 1;
for (int i=1; i<65536; i++) p1[i] = 1ll * p1[i-1] * t1 % MOD;
for (int i=1; i<65536; i++) p2[i] = 1ll * p2[i-1] * t2 % MOD;
}
int operator()(int n) const {return 1ll * p2[n>>16] % MOD * p1[n&65535] % MOD;}
};
取模还原分数 (by Elegia)
https://blog.csdn.net/EI_Captain/article/details/117172239
pair<int, int> approx(int p, int q, int A) {
int x = q, y = p, a = 1, b = 0;
while (x > A) {
swap(x, y); swap(a, b);
a -= x / y * b;
x %= y;
}
return make_pair(x, a);
}
传引用的 exgcd
ll exgcd(ll a, ll b, ll& x, ll& y)
{
if (!b){x = 1; y = 0; return a;}
ll _ = exgcd(b, a%b, x, y), old_x = x, old_y = y;
x = old_y; y = old_x - (a/b) * old_y;
return _;
}
线性筛素数、欧拉函数、莫比乌斯函数
inline void linear_sieve(int n)
{
notprime[1] = true; phi[1] = mu[1] = 1;
for (int i=2; i<=n; i++)
{
if (!notprime[i]){plist.emplace_back(i); phi[i] = i-1; mu[i] = -1;}
for (auto x : plist)
{
int now = i*x;
if (now > n) break;
notprime[now] = true;
if (!(i%x)){phi[now] = phi[i] * x; mu[now] = 0; break;}
phi[now] = phi[i] * phi[x]; mu[now] = mu[i] * mu[x];
}
}
}
Simple Graph
template <typename T>
struct SimpleGraph
{
typedef vector<pair<int, T> > _;
_ g[N];
inline void addedge(int u, int v, T w){g[u].emplace_back(make_pair(v, w));}
inline void ade(int u, int v, T w){addedge(u, v, w); addedge(v, u, w);}
inline _ operator[](const int& id) const {return g[id];}
inline _& operator[](const int& id){return g[id];}
inline void clear(int n = N - 1){for (int i=0; i<=n; i++) g[i].clear();}
};
Future Graph
template <typename T>
struct FutureGraph
{
typedef pair<int, pair<int, T> > pit;
int id;
vector<pit> g[N];
inline void addedge(int u, int v, T w){g[u].emplace_back(make_pair(id++, make_pair(v, w)));}
inline void ade(int u, int v, T w){addedge(u, v, w); addedge(v, u, w);}
inline vector<pit> operator[](const int& id) const {return g[id];}
inline vector<pit>& operator[](const int& id){return g[id];}
inline static int rev(int id){return id ^ 1;}
inline void clear(int n = N - 1){id = 0; for (int i=0; i<=n; i++) g[i].clear();}
FutureGraph(){id = 0;}
};
树剖求 LCA
namespace LCA
{
int fa[N], dep[N], siz[N], son[N], top[N], dfn[N], rnk[N], cc;
void dfs1(int u)
{
siz[u] = 1;
for (auto v : g[u])
{
if (fa[u] == v) continue;
dep[v] = dep[u] + 1;
fa[v] = u;
dfs1(v);
siz[u] += siz[v];
if (!son[u]|| (siz[v] > siz[son[u]])) son[u] = v;
}
}
void dfs2(int u, int t)
{
top[u] = t;
rnk[++cc] = u; dfn[u] = cc;
if (!son[u]) return ;
dfs2(son[u], t);
for (auto v : g[u])
if ((v != son[u]) && (v != fa[u])) dfs2(v, v);
}
int lca(int u, int v)
{
while (top[u] != top[v])
{
if (dep[top[u]] > dep[top[v]]) u = fa[top[u]];
else v = fa[top[v]];
}
return dep[u] > dep[v] ? v : u;
}
}
KMP 字符串匹配
typedef char str[N];
str s1, s2;
int l1, l2, nxt[N], f[N];
void getnxt()
{
nxt[1] = 0; int j = 0;
for (int i=2; i<=l2; i++)
{
while (j && (s2[i] != s2[j+1])) j = nxt[j];
if (s2[i] == s2[j+1]) ++j;
nxt[i] = j;
}
}
void kmp()
{
int j = 0;
for (int i=1; i<=l1; i++)
{
while ((j==l2) || (j && (s1[i] != s2[j+1]))) j = nxt[j];
if (s1[i] == s2[j+1]) ++j;
f[i] = j;
}
}
AC Automaton
// 此处字符集为小写字母('a' ~ 'z')
const int N = 1e6 + 50, alphabet= 26;
struct ACAM
{
int tr[N][alphabet], fail[N], mark[N], cc, root;
inline void insert(string s)
{
int u = root, l = s.length();
for (int i=0; i<l; i++)
{
if (!tr[u][s[i] - 'a']) tr[u][s[i] - 'a'] = ++cc;
u = tr[u][s[i] - 'a'];
} ++mark[u];
}
inline void build()
{
queue<int> q; fail[root] = root;
for (int i=0; i<alphabet; i++)
{
if (tr[root][i]){q.push(tr[root][i]); fail[tr[root][i]] = root;}
else tr[root][i] = root;
}
while (!q.empty())
{
int u = q.front(); q.pop();
for (int i=0; i<alphabet; i++)
{
if (tr[u][i]){fail[tr[u][i]] = tr[fail[u]][i]; q.push(tr[u][i]);}
else tr[u][i] = tr[fail[u]][i];
}
}
}
inline int query(string s)
{
int u = root, ans = 0, l = s.length();
for (int i=0; i<l; i++)
{
u = tr[u][s[i] - 'a'];
for (int j = u; j && ~mark[j]; j = fail[j]){ans += mark[j]; mark[j] = -1;}
} return ans;
}
inline void clear(){memset(tr, 0, sizeof tr); memset(mark, 0, sizeof mark); cc = 0;}
AC(){root = cc = 0;}
}ac;
ST 表
// 传入一个 Functor 给 op,要求:
// 1. op(x, x) = x (消去律)
// 2. op(x, op(y, z)) = op(op(x, y), z) (结合律)
template<typename T, typename op>
struct ST
{
typedef unsigned U;
T f[N][_];
template <typename rit>
inline void reset(rit fst, rit sec)
{
const U n = sec - fst;
for (U i=1; i<=n; i++) f[i][0] = *(fst + (i-1));
for (U j=1; (1u<<j)<=n; j++)
for (U i=1; i+(1u<<j)-1u<=n; i++) f[i][j] = op()(f[i][j-1], f[i + (1<<(j-1))][j-1]);
}
inline T query(U l, U r)const{U _ = __lg(r-l+1); return op()(f[l][_], f[r-(1<<_)+1][_]);}
template <typename rit>
ST(rit fst, rit sec){reset(fst, sec);}
ST() = default;
~ST() = default;
};
ST 表,但是查询最值位置
// 传入一个 Functor 给 op,要求:
// 1. op(x, x) = x (消去律)
// 2. op(x, op(y, z)) = op(op(x, y), z) (结合律)
template<typename T, typename op>
struct ST
{
typedef unsigned U;
T f[N][_]; U pos[N][_];
template <typename rit>
inline void reset(rit fst, rit sec)
{
const U n = sec - fst;
for (U i=1; i<=n; i++){f[i][0] = *(fst + (i-1)); pos[i][0] = i;}
for (U j=1; (1u<<j)<=n; j++)
for (U i=1; i+(1u<<j)-1u<=n; i++)
{
if (op()(f[i][j-1], f[i+(1<<(j-1))][j-1])){f[i][j] = f[i][j-1]; pos[i][j] = pos[i][j-1];}
else{f[i][j] = f[i+(1<<(j-1))][j-1]; pos[i][j] = pos[i+(1<<(j-1))][j-1];}
}
}
inline T query(U l, U r)const{U _ = __lg(r-l+1); return op()(f[l][_], f[r-(1<<_)+1][_]);}
inline U querypos(U l, U r)const{U _ = __lg(r-l+1); return op()(f[l][_], f[r-(1<<_)+1][_]) ? pos[l][_] : pos[r-(1<<_)+1][_];}
template <typename rit>
ST(rit fst, rit sec){reset(fst, sec);}
ST() = default;
~ST() = default;
};
ST 表,但是查询最值位置(偏序 ver.)
template <typename T, typename op = less<T> >
struct ST
{
static const int LgN = __lg(N) + 10;
typedef unsigned U;
typedef pair<T, U> ptu;
ptu f[N][_];
bool compare(const ptu& A, const ptu& B){return op()(A.first, B.first);}
ptu min(const ptu& A, const ptu& B){return compare(A, B) ? A : B;}
template <typename _ptr>
inline void reset(_ptr fst, _ptr edp)
{
int n = 0;
for (int i=1; fst!=edp; i++){f[i][0] = make_pair(*fst, i); ++fst; ++n;}
for (int j=1; (1<<j)<=n; j++)
for (int i=1; i+(1<<(j-1))-1<=n; i++)
f[i][j] = min(f[i][j-1], f[i+(1<<(j-1))][j-1]);
}
inline ptu querybase(U l, U r){++l; ++r; int _ = __lg(r-l+1); return min(f[l][_], f[r-(1<<_)+1][_]);}
inline T query(U l, U r){return querybase(l, r).first;}
inline U querypos(U l, U r){return querybase(l, r).second - 1;}
ST() = default;
~ST() = default;
template <typename _ptr>
ST(_ptr a, _ptr b){reset(a, b);}
template <typename _contain>
ST(_contain a){reset(a.begin(), a.end());}
};=
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16134283.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ