basic.h
1234567_scp · · 个人记录
1. 定义
bn(x,y) bool(x&(1<<y))
enter putchar('\n')
ll long long
ull unsigned ll
uint unsigned int
uc unsigned char
sc char
vec vector
vi vector<int>
vs vector<string>
str string
wc wchar_t
us unsigned short
ss short
pii pair<int, int>
pll pair<ll, ll>
pr pair
o[sc c]: c 的种类:
0: 分隔符
1: 数字符
2: 英文字符
3: 控制符 (+-*/%:!~&|^$@<>?)
4: 标点符 (,.;'"\)
2. 向量
istream
ostream
(vec<T>) v += (T)x : 向量末尾添加元素 x
--(vc<T>)v : 向量末尾减除一个元素
(vec<T>) v^=x 将向量长度强制转为 x,过长的删除末尾,过短的末尾补 T()
int right(vec<T> v, int x, T stf={}): 将向量右移 x 位,用 stf 补位
int left(vec<T> v, int x): 将向量左移 x 位
int cright(vec<T> v, int x, int l=0, int r=-1): 将向量的区间 [l, r] 上的数循环右移 x 位,负数代表从右数
int cleft (vec<T> v, int x, int l=0, int r=-1): 将向量的区间 [l, r] 上的数循环左移 x 位,负数代表从右数
int vprint (vec<T> v, str spl=" ", str end="\n"): 将向量的每一个数输出,以 spl 分隔,以 end 结尾
vec<T> loc(vec<T> v, int l=0, int r=-1, int d=1): 将向量切片:区间 [l, r],步长 d
3. 字符串
int Int(str t): 字符串转整数
string Str(int x): 整数转字符串
void init(): 一些初始化
ll fcin(): 快读
void fcout(ll x, sc _outc='\n'): 快输
vs split(str s, int spl=1): 将字符串按照字符种类划分,默认只划分分隔符 (空格,回车等)
vs split(str s, set<sc> spl): 将字符串按照字符集 spl 划分
vs split(str s, str spl): 将字符串按照字符串划分,每一个在 spl 中出现的字符作为分隔符
vs input(int spl=1): 读入一行,将返回此行按照字符种类划分的向量,默认只划分分隔符 (空格,回车等)
vs Input(int spl=1): 读入直至非空一行,将返回此行按照字符种类划分的向量,默认只划分分隔符 (空格,回车等)
vs Vs(vi v): 将整数向量转为字符串向量,每一个整数转为字符串
vi Vi(vs v): 将字符串向量转为整数向量,每一个字符串转为整数
mix(vs v, str spl=""): 将字符串向量转为字符串,以 spl 分隔
4. 集合
Set(vec v): 将 v 的每一个元素放入 S 中,即向量转集合
Set(str s): 将 s 的每一个元素放入 S 中,即字符串转集合
A | B : 并集
A & B : 交集
A - B : 差集
A * B : 笛卡尔积
A <= B : A 包含于 B
A >= B : A 包含 B
A < B : A 真包含于 B
A > B : A 真包含 B
A == B : A 等于 B
A != B : A 不等于 B
(T)a < (set<T>)B : a 属于 B
5. 其他
rd(l, r) 生成一个 [l, r) 的随机数
#include<bits/stdc++.h>
#include<conio.h>
using namespace std;
#define bn(x,y) bool(x&(1<<y))
#define enter putchar('\n')
#define vec vector
#define pr pair
#define mset multiset
#define uset unordered_set
#define umap unordered_map
using ll=long long;
using ull=unsigned ll;
using uint=unsigned int;
using uc=unsigned char;
using sc=char;
using str=string;
using wc=wchar_t;
using us=unsigned short;
using ss=short;
using vi=vec<int>;
using vs=vec<str>;
using pii=pr<int, int>;
using pll=pr<ll, ll>;
using seti=set<int>;
using mseti=mset<int>;
ll fcin() {
ll r=0;
bool s=0;
char c=getchar();
for(; c<48||c>57; c=getchar()) s^=c=='-';
for(; c>47&&c<58; c=getchar()) r=r*10+(c&15);
return s? -r: r;
}
int _otop;
char _out[100];
void fcout(ll x, char _outc='\n') {
x? x<0? (x=-x, putchar('-')): 0: putchar('0');
for(_otop=0; x; x/=10) _out[++_otop]=x%10+48;
for(; _otop; putchar(_out[_otop--]));
putchar(_outc);
}
//==================================================================
int Int(str t) {
int r=0, i=0, s=0;
for(; i<t.size()&&(t[i]<48||t[i]>57); i++) s^=t[i]=='-';
for(; i<t.size()&&t[i]>47&&t[i]<58; i++) r=r*10+(t[i]&15);
return s? -r: r;
}
string Str(int x) {
str t;
if (x==0) t="0";
if (x<0) t="-", x=-x;
for(_otop=0; x; x/=10) _out[++_otop]=x%10+48;
for(; _otop; t+=_out[_otop--]);
return t;
}
//==================================================================
template<class T>
T operator += (vec<T>& v, T x) {
return v.push_back(x), x;
}
template<class T>
T operator -- (vec<T>& v) {
T x=v[v.size()-1];
return v.pop_back(), x;
}
template<class T>
int right (vec<T>& v, int x, T stf={}) {
int s=v.size();
if (x<=0) return s;
for(int i=x; i; i--)
v+=s>=i? v[s-i]: stf;
for(int i=s-1; i>=x; i--)
v[i]=v[i-x];
for(int i=0; i<x; i++)
v[i]=stf;
return s+x;
}
template<class T>
int left (vec<T>& v, int x) {
int s=v.size();
if (x<=0) return s;
if (s<=x) return v={}, 0;
for(int i=0; i+x<s; i++)
v[i]=v[i+x];
for(int i=1; i<=x; i++)
--v;
return s-x;
}
template<class T>
int cright (vec<T>& v, int x, int l=0, int r=-1) {
vec<T> u=v;
int s=v.size();
if (l<0) l+=s;
if (l<0) return -1;
if (r<0) r+=s;
if (l>r) return -1;
for(int i=l; i<=r; i++)
v[i]=u[(i+x)%(r-l+1)+l];
return s;
}
template<class T>
int cleft (vec<T>& v, int x, int l=0, int r=-1) {
vec<T> u;
int s=v.size();
if (l<0) l+=s;
if (l<0) return -1;
if (r<0) r+=s;
if (l>r) return -1;
for(int i=0; i<s; i++)
u[i]=v[(i+x)%(r-l+1)+l];
v=u;
return s;
}
template<class T>
int operator ^= (vec<T>& v, int x) {
int ret=v.size()<x? -1: v.size()>x? 1: 0;
if (ret==1)
for(int i=v.size(); i>x; i--)
--v;
else if (ret==1)
for(int i=v.size(); i<x; i++)
v+=T();
return ret;
}
template<class T>
int vprint(const vec<T>& v, str spl=" ", str end="\n") {
if (!v.size()) return cout<<end, 1;
for(int i=0; i<v.size()-1; i++)
cout<<v[i]<<spl;
cout<<v[v.size()-1]<<end;
}
template<class T>
vec<T> loc(const vec<T>& v, int l=0, int r=-1, int d=1) {
int s=v.size();
if (l<0) l+=s;
if (r<0) r+=s;
if (l<0 || l>s || r>s || r<0 || d>0 && l>r || d==0 || d<0 && l<r) return {};
vec<T> u;
for(int i=l; d>0? i<=r: i>=r; i+=d)
u+=v[i];
return u;
}
set<char> Set(str s) {
set<sc> U;
for(sc c: s)
U.insert(c);
return U;
}
template<class T>
set<T> Set(vec<T> v) {
set<T> U;
for(T x: v)
U.insert(x);
return U;
}
template<class T>
void operator += (set<T>& A, T t) {
A.insert(t);
}
template<class T>
void operator -= (set<T>& A, T t) {
A.erase(t);
}
template<class T>
bool operator < (T x, const set<T>& A) {
return A.find(x)!=A.end();
}
template<class T>
bool operator <= (const set<T>& A, const set<T>& B) {
if (A.size()>B.size()) return 0;
for(int x: A)
if (!(x<B)) return 0;
return 1;
}
template<class T>
bool operator >= (const set<T>& A, const set<T>& B) {
return B<=A;
}
template<class T>
bool operator < (const set<T>& A, const set<T>& B) {
return A.size()<B.size() && A<=B;
}
template<class T>
bool operator > (const set<T>& A, const set<T>& B) {
return B<A;
}
template<class T>
bool operator == (const set<T>& A, const set<T>& B) {
return A.size()==B.size() && A<=B;
}
template<class T>
bool operator != (const set<T>& A, const set<T>& B) {
return !(A==B);
}
template<class T>
set<T> operator | (set<T> A, const set<T>& B) {
for(T t: B) A+=t;
return A;
}
template<class T>
set<T> operator & (const set<T>& A, const set<T>& B) {
set<T> C;
if (A.size()<=B.size()) {
for(T t: A)
if (t<B) C+=t;
return C;
}
else return B&A;
}
template<class T>
set<T> operator - (const set<T>& A, const set<T>& B) {
set<T> C;
for(T t: A)
if (!(t<B)) C+=t;
return C;
}
template<class T1, class T2>
set<pr<T1, T2> > operator * (const set<T1>& A, const set<T2>& B) {
set<pr<T1, T2> >S;
for(T1 t1: A)
for(T2 t2: B)
S+=make_pair(t1, t2);
return S;
}
int o[256];
str _s1="0123456789";
str _s2="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
str _s3="+-*/%:!~&|^$@<>?";
str _s4=",.;\'\"\\";
int st_init() {
for(sc c: _s1) o[c]=1;
for(sc c: _s2) o[c]=2;
for(sc c: _s3) o[c]=3;
for(sc c: _s4) o[c]=4;
return 0;
}
vs split(str s, int spl=1) {
vs v;
str t;
for(sc c: s)
if (!bn(spl, o[c])) t+=c;
else if (t.size()) v+=t, t="";
if (t.size()) v+=t;
return v;
}
vs split(str s, set<sc> spl) {
vs v;
str t;
for(sc c: s)
if (spl.find(c)==spl.end()) t+=c;
else if (t.size()) v+=t, t="";
if (t.size()) v+=t;
return v;
}
vs split(str s, str spl) {
if (s.size()>=1000 && spl.size()>=100)
return split(s, Set(spl));
vs v;
str t;
for(sc c: s)
if (spl.find(c)==-1) t+=c;
else if (t.size()) v+=t, t="";
if (t.size()) v+=t;
return v;
}
str mix(vs v, str spl="") {
str s;
for(int i=0; i<v.size()-1; i++)
s+=v[i]+spl;
return s+v[v.size()-1];
}
vs input(int spl=1) {
str s;
getline(cin, s);
return split(s, spl);
}
vs Input(int spl=1) {
vs v;
while(v.size()==0) v=input(spl);
return v;
}
vi Vi(vs t) {
vi v;
for(str s: t)
v+=Int(s);
return v;
}
vs Vs(vi t) {
vs v;
for(int i: t)
v+=Str(i);
return v;
}
template<class T>
vec<T> Vec(T x, int n=1) {
return vec<T>(n, x);
}
int basic_init(ll rand_seed=time(0)) {
int fg=0;
fg|=st_init();
srand(rand_seed);
return fg;
}
ll rd(ll l, ll r) {
return (1ll*rand()<<48|1ll*rand()<<32|rand()<<16|rand())%(r-l)+l;
}
template<class T>
istream& operator >> (istream& is, vec<T>& v) {
v.clear();
for(T t; is>>t; )
v+=t;
return is;
}
void help() {
freopen("basic_help.txt", "r", stdin);
for(str s; getline(cin, s); cout<<s<<"\r\n");
freopen("CON", "r", stdin);
}