basic.h

· · 个人记录

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);
}