后缀数组
const int N=3e5+3,K=20;
struct SA{
int n;
char s[N];
int sa[N],rk[N],ht[N];
// sa[i]: i-th smallest suffix is s[sa[i]..n]
// rk[i]: suffix s[i..n] is rk[i] smallest
// ht[i]: LCP of s[i..n] and s[sa[rk[i]-1]..n]
void getsa(int k=127){ // k: character set size
static int sb[N],_rk[N],ct[N];
int m,i,j,*rko=rk,*rkn=_rk;
for(i=1;i<=n;i++)ct[s[i]]++;
for(i=2;i<=k;i++)ct[i]+=ct[i-1];
for(i=n;i;i--)sa[ct[s[i]]--]=i;
memset(ct+1,0,sizeof(int)*k);
for(i=1,k=0;i<=n;i++)rk[sa[i]]=k+=s[sa[i]]!=s[sa[i-1]];
for(m=1;k<n;m<<=1){
for(j=1;j<=m;j++)sb[j]=n-m+j;
for(i=1;i<=n;i++)if(sa[i]>m)sb[j++]=sa[i]-m;
for(i=1;i<=n;i++)ct[rko[i]]++;
for(i=2;i<=k;i++)ct[i]+=ct[i-1];
for(i=n;i;i--)sa[ct[rko[sb[i]]]--]=sb[i];
memset(ct+1,0,sizeof(int)*k);
for(i=1,k=0;i<=n;i++)rkn[sa[i]]=k+=rko[sa[i]]!=rko[sa[i-1]]||rko[sa[i]+m]!=rko[sa[i-1]+m];
swap(rko,rkn);
}
if(rko!=rk)memcpy(rk+1,_rk+1,sizeof(int)*n);
}
void getht(){
int i,j,h=0;
for(i=1;i<=n;i++){
j=sa[rk[i]-1];
h-=h>0;
while(s[j+h]==s[i+h])++h;
ht[rk[i]]=h;
}
}
int st[K][N];
void makest(){
memcpy(st[0]+1,ht+1,sizeof(int)*n);
for(int k=1;(1<<k)<=n;k++)
for(int i=1;i+(1<<k)-1<=n;i++)
st[k][i]=min(st[k-1][i],st[k-1][i+(1<<k-1)]);
}
void init(const string &S){
strcpy(s+1,S.c_str());
n=S.size();
getsa();
getht();
makest();
}
int getmin(int l,int r){
int k=__lg(r-l+1);
return min(st[k][l],st[k][r-(1<<k)+1]);
}
int lcp(int x,int y){
if(x==y)return n-x+1;
x=rk[x];y=rk[y];
if(x>y)swap(x,y);
return getmin(x+1,y);
}
};
随机数
#include<bits/stdc++.h>
using namespace std;
mt19937_64 rnd(random_device{}());
int get(int l,int r){
uniform_int_distribution dt(l,r);
return dt(rnd);
}
int main(){
cout<<rnd()<<endl;
uniform_int_distribution dis1(1,100);
cout<<dis1(rnd)<<endl;
uniform_real_distribution<double>dis2(0,1);
cout<<dis2(rnd)<<endl;
}
Dinic最大流
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
struct Dinic{
int n,S,T; // normally, n=T
struct edge{int to,nxt;ll c;};
vector<edge>e;
vi lst;
Dinic(int _n):n(_n){
lst.resize(n+1);
e.resize(2);
}
Dinic(int _n,int s,int t):n(_n),S(s),T(t){
lst.resize(n+1);
e.resize(2);
}
void setST(int s,int t){
S=s;T=t;
}
void link(int u,int v,ll c){
e.push_back({v,lst[u],c});
lst[u]=e.size()-1;
}
void add(int u,int v,ll c){
link(u,v,c);
link(v,u,0);
}
vi dis,cur;
bool bfs(){
dis.clear();dis.resize(n+1);
cur=lst;
queue<int>Q;Q.push(T);
dis[T]=1;
while(Q.size()){
int u=Q.front();Q.pop();
for(int i=lst[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(e[i^1].c&&!dis[v])
dis[v]=dis[u]+1,Q.push(v);
}
}
return dis[S];
}
ll dfs(int u,ll in){
if(u==T)return in;
ll out=0;
for(int &i=cur[u];i;i=e[i].nxt){
int v=e[i].to;
if(e[i].c&&dis[v]==dis[u]-1){
ll res=dfs(v,min(in,e[i].c));
e[i].c-=res;e[i^1].c+=res;
in-=res;out+=res;
if(in==0)return out;
}
}
return out;
}
ll max_flow(){
ll f=0;
while(bfs())f+=dfs(S,1e18);
return f;
}
};
int main(){
int n,m,s,t;
ll f=0;
cin>>n>>m>>s>>t;
Dinic D(n,s,t);
for(int i=1;i<=m;i++){
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
D.add(u,v,c);
}
printf("%lld",D.max_flow());
return 0;
}