再来一些模板

后缀数组
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;
}
posted @ 2025-05-06 14:37  nkxjlym  阅读(42)  评论(0)    收藏  举报