• 模板


    KMP

    int KMP(char S[200010],char T[200010],int wz[200010],int n,int m)
    {
    	ne[0]=-1;
    	for(int i=1;i<=m;i++)
    	{
    		int t=ne[i-1];
    		while(t!=-1&&T[i-1]!=T[t])
    			t=ne[t];
    		ne[i]=t+1;
    	}
    	int a=0,b=0,sl=0;
    	while(a<=n)
    	{
    		if(b==m)
    		{
    			wz[sl++]=a-m;
    			b=ne[b];
    		}
    		if(b==-1||S[a]==T[b])
    			a+=1,b+=1;
    		else
    			b=ne[b];
    	}
    	return sl;
    }
    

    点双连通分量

    void tarjan(int u,int f)
    {
    	st[tp++]=u;
    	dfn[u]=low[u]=++tm;
    	for(int i=fr[u];i!=-1;i=ne[i])
    	{
    		if(v[i]==f)continue;
    		if(!dfn[v[i]])
    		{
    			int la=tp,lb=tb;
    			sb[tb++]=i;tarjan(v[i],u);
    			if(low[v[i]]>=dfn[u])
    			{
    				ss+=1;
    				for(int j=la;j<tp;j++)
    					bc[ss].push_back(st[j]);
    				for(int j=lb;j<tb;j++)
    					bb[ss].push_back(sb[j]);
    				tp=la;tb=lb;bc[ss].push_back(u);
    			}
    			low[u]=min(low[u],low[v[i]]);
    		}
    		else
    		{
    			low[u]=min(low[u],dfn[v[i]]);
    			sb[tb++]=i;
    		}
    	}
    }
    

    行列式

    int hangls(int sz[102][102],int n)
    {
    	int jg=1;
    	for(int i=0;i<n;i++)
    	{
    		int wz=-1;
    		for(int j=i;j<n;j++)
    		{
    			if(sz[j][i]!=0)
    			{
    				wz=j;
    				break;
    			}
    		}
    		if(wz==-1)
    			continue;
    		if(wz!=i)
    		{
    			jg=md-jg;
    			for(int j=0;j<n;j++)
    			{
    				int t=sz[i][j];
    				sz[i][j]=sz[wz][j];
    				sz[wz][j]=t;
    			}
    		}
    		for(int j=i+1;j<n;j++)
    		{
    			int t=1ll*sz[j][i]*ksm(sz[i][i],md-2)%md;
    			for(int k=i;k<n;k++)
    				sz[j][k]=(sz[j][k]-1ll*sz[i][k]*t%md+md)%md;
    		}
    	}
    	for(int i=0;i<n;i++)
    		jg=1ll*jg*sz[i][i]%md;
    	return jg;
    }
    

    后缀数组

    int sa[30010],x[60010],y[30010],sl[30010],ra[30010],hei[30010];
    char zf[30010];
    void getsa(int n)
    {
    	for(int i=0;i<n;i++)
    	    sl[x[i]=zf[i]]+=1;
    	for(int i=1;i<='z';i++)
    	    sl[i]+=sl[i-1];
    	for(int i=n-1;i>=0;i--)
    	    sa[--sl[x[i]]]=i;
    	int m='z';
    	for(int mi=1;mi<=n;mi*=2)
    	{
    	    int s=0;
    	    for(int i=n-mi;i<n;i++)
    			y[s++]=i;
    	    for(int i=0;i<n;i++)
    	    {
    			if(sa[i]>=mi)
    				y[s++]=sa[i]-mi;
    	    }
    	    for(int i=1;i<=m;i++)
    			sl[i]=0;
    	    for(int i=0;i<n;i++)
    			sl[x[i]]+=1;
    	    for(int i=1;i<=m;i++)
    			sl[i]+=sl[i-1];
    	    for(int i=n-1;i>=0;i--)
    			sa[--sl[x[y[i]]]]=y[i];
    	    m=1;
    	    for(int i=0;i<n;i++)
    	    {
    			if(i!=0&&(x[sa[i]]!=x[sa[i-1]]||x[sa[i]+mi]!=x[sa[i-1]+mi]))
    				m+=1;
    			y[sa[i]]=m;
    	    }
    	    if(m==n)
    			break;
    	    for(int i=0;i<n;i++)
    			x[i]=y[i];
    	}
    	for(int i=0;i<n;i++)
    	    ra[sa[i]]=i;
    	for(int i=0,h=0;i<n;i++)
    	{
    	    if(ra[i]==0)
    			continue;
    	    if(h>0)
    			h-=1;
    	    int j=sa[ra[i]-1];
    	    while(zf[i+h]==zf[j+h])
    			h+=1;
    	    hei[ra[i]]=h;
    	}
    }
    

    后缀自动机

    int fa[2000010],trs[2000010][26],len[2000010],sl=1,la=1;
    void insert(int c)
    {
    	int np=++sl,p=la;
    	len[np]=len[la]+1,la=np;
    	while(p!=0&&trs[p][c]==0)
    	{
    		trs[p][c]=np;
    		p=fa[p];
    	}
    	if(p==0)
    		fa[np]=1;
    	else
    	{
    		int q=trs[p][c];
    		if(len[q]==len[p]+1)
    			fa[np]=q;
    		else
    		{
    			int nq=++sl;
    			len[nq]=len[p]+1;
    			fa[nq]=fa[q];
    			fa[np]=fa[q]=nq;
    			for(int i=0;i<26;i++)
    				trs[nq][i]=trs[q][i];
    			while(p!=0&&trs[p][c]==q)
    			{
    				trs[p][c]=nq;
    				p=fa[p];
    			}
    		}
    	}
    }
    

    费用流

    #include <stdio.h>
    int fr[1005],ne[10010],v[10010],w[10010],fy[10010],bs=0;
    int jl[1005],dl[400010],N,S,T,inf=99999999;
    bool bk[1005];
    void add(int a,int b,int c,int d)
    {
    	v[bs]=b;
    	w[bs]=c;
    	fy[bs]=d;
    	ne[bs]=fr[a];
    	fr[a]=bs++;
    }
    void addb(int a,int b,int c,int d)
    {
    	add(a,b,c,d);
    	add(b,a,0,-d);
    }
    bool spfa()
    {
    	int he=0,ta=1;
    	for(int i=1;i<=N;i++)
    	{
    		bk[i]=false;
    		jl[i]=inf;
    	}
    	dl[0]=S;jl[S]=0;
    	while(he<ta)
    	{
    		int u=dl[he];
    		bk[u]=false;
    		for(int i=fr[u];i!=-1;i=ne[i])
    		{
    			if(w[i]>0&&jl[u]+fy[i]<jl[v[i]])
    			{
    				jl[v[i]]=jl[u]+fy[i];
    				la[v[i]]=u;lb[v[i]]=i;
    				if(!bk[v[i]])
    				{
    					dl[ta++]=v[i];
    					bk[v[i]]=true;
    				}
    			}
    		}
    		he+=1;
    	}
    	return jl[T]<inf;
    }
    int feiyl(int &fei)
    {
    	fei=0;
    	int liu=0;
    	while(spfa())
    	{
    		int t=T,zx=inf;
    		while(t!=S)
    		{
    			if(w[lb[t]]<zx)
    				zx=w[lb[t]];
    			t=la[t];
    		}
    		liu+=zx;
    		t=T;
    		while(t!=S)
    		{
    			w[lb[t]]-=zx;
    			w[lb[t]^1]+=zx;
    			fei+=zx*fy[lb[t]];
    			t=la[t];
    		}
    	}
    	return liu;
    }
    

    LCT+Splay

    #include <stdio.h>
    int c1[2010],c2[2010],fa[2010];
    int wz[2010],qz[2010];
    bool ld[2010];
    void pu(int i)
    {
    	wz[i]=wz[c1[i]];
    	if(qz[wz[c2[i]]]>qz[wz[i]])
    		wz[i]=wz[c2[i]];
    	if(qz[i]>qz[wz[i]])
    		wz[i]=i;
    }
    void pur(int x)
    {
    	ld[x]=!ld[x];
    	int t=c1[x];
    	c1[x]=c2[x];
    	c2[x]=t;
    }
    void pd(int x)
    {
    	if(ld[x])
    	{
    		if(c1[x]!=0)
    			pur(c1[x]);
    		if(c2[x]!=0)
    			pur(c2[x]);
    		ld[x]=false;
    	}
    }
    void zuox(int x)
    {
    	int t=c2[x];
    	c2[x]=c1[t];fa[c1[t]]=x;
    	c1[t]=x;fa[t]=fa[x];
    	if(x==c1[fa[x]])c1[fa[x]]=t;
    	else if(x==c2[fa[x]])c2[fa[x]]=t;
    	fa[x]=t;
    	pu(x);pu(t);
    }
    void youx(int x)
    {
    	int t=c1[x];
    	c1[x]=c2[t];fa[c2[t]]=x;
    	c2[t]=x;fa[t]=fa[x];
    	if(x==c1[fa[x]])c1[fa[x]]=t;
    	else if(x==c2[fa[x]])c2[fa[x]]=t;
    	fa[x]=t;
    	pu(x);pu(t);
    }
    void rotate(int x)
    {
    	if(x==c1[fa[x]])
    		youx(fa[x]);
    	else
    		zuox(fa[x]);
    }
    bool isrt(int x)
    {
    	return x!=c1[fa[x]]&&x!=c2[fa[x]];
    }
    void clean(int x)
    {
    	if(!isrt(x))
    		clean(fa[x]);
    	pd(x);
    }
    void splay(int x)
    {
    	clean(x);
    	while(!isrt(x))
    	{
    		if(isrt(fa[x]))
    			rotate(x);
    		else
    		{
    			int f=fa[x];
    			if((f==c1[fa[f]])==(x==c1[f]))
    			{
    				rotate(fa[x]);
    				rotate(x);
    			}
    			else
    				rotate(x);
    		}
    	}
    }
    void access(int x)
    {
    	int y=0;
    	while(x!=0)
    	{
    		splay(x);
    		c2[x]=y;
    		pu(x);
    		y=x;x=fa[x];
    	}
    }
    void makert(int x)
    {
    	access(x);
    	splay(x);
    	pur(x);
    }
    int findrt(int x)
    {
    	access(x);
    	splay(x);
    	while(c1[x]!=0)
    		x=c1[x];
    	splay(x);
    	return x;
    }
    void link(int x,int y)
    {
    	makert(x);
    	makert(y);
    	fa[x]=y;
    }
    void cut(int x,int y)
    {
    	makert(x);
    	access(y);
    	splay(x);
    	c2[x]=fa[y]=0;
    }
    int getmax(int x,int y)
    {
    	makert(x);
    	access(y);
    	splay(x);
    	return wz[x];
    }
    

    扩展卢卡斯

    int qz[30][10010];
    void dfs(int n,int &a,int &b,int x,int mi,int bh)
    {
    	if(n==0)
    	{
    		a=1;b=0;
    		return;
    	}
    	dfs(n/x,a,b,x,mi,bh);
    	b+=n/x;
    	a=1ll*a*ksm(qz[bh][mi],n/mi,mi)%mi;
    	a=1ll*a*qz[bh][n%mi]%mi;
    }
    void exgcd(int a,int b,int &x,int &y)
    {
    	if(b==0)
    	{
    		x=1;
    		y=0;
    	}
    	else
    	{
    		exgcd(b,a%b,y,x);
    		y-=(a/b)*x;
    	}
    }
    int getws(int n,int x)
    {
    	int rt=0;
    	while(n>0)
    	{
    		rt+=n/x;
    		n/=x;
    	}
    	return rt;
    }
    int getz(int n,int m,int x,int mi,int k,int bh)
    {
    	if(getws(n,x)-getws(m,x)-getws(n-m,x)>=k)
    		return 0;
    	int a1,b1;dfs(n,a1,b1,x,mi,bh);
    	int a2,b2;dfs(n-m,a2,b2,x,mi,bh);
    	int a3,b3;dfs(m,a3,b3,x,mi,bh);
    	b1-=(b2+b3);
    	int x2,y2,x3,y3;
    	exgcd(a2,mi,x2,y2);
    	exgcd(a3,mi,x3,y3);
    	x2=(x2%mi+mi)%mi;
    	x3=(x3%mi+mi)%mi;
    	a1=1ll*a1*x2%mi*x3%mi;
    	return 1ll*a1*ksm(x,b1,mi)%mi;
    }
    int fj[30],mi[30],xs[30],cs[30],sl=0;
    void getcrt(int p)
    {
    	int tp=p;sl=0;
    	for(int i=2;1ll*i*i<=tp;i++)
    	{
    		if(tp%i==0)
    		{
    			fj[sl]=i;mi[sl]=1;cs[sl]=0;
    			while(tp%i==0)
    			{
    				tp/=i;
    				mi[sl]*=i;
    				cs[sl]+=1;
    			}
    			sl+=1;
    		}
    	}
    	if(tp!=1)
    	{
    		fj[sl]=mi[sl]=tp;
    		cs[sl++]=1;
    	}
    	for(int i=0;i<sl;i++)
    	{
    		int x,y;
    		exgcd(p/mi[i],mi[i],x,y);
    		x=(x%mi[i]+mi[i])%mi[i];
    		xs[i]=1ll*(p/mi[i])*x%p;
    	}
    	for(int i=0;i<sl;i++)
    	{
    		qz[i][0]=1;
    		for(int j=1;j<=mi[i];j++)
    		{
    			qz[i][j]=qz[i][j-1];
    			if(j%fj[i]!=0)
    				qz[i][j]=1ll*qz[i][j]*j%mi[i];
    		}
    	}
    }
    int C(int n,int m,int p)
    {
    	if(n<0||m<0||m>n)
    		return 0;
    	int jg=0;
    	for(int i=0;i<sl;i++)
    	{
    		int rt=getz(n,m,fj[i],mi[i],cs[i],i);
    		jg=(jg+1ll*rt*xs[i])%p;
    	}
    	return jg;
    }
    

    trie图

    void bfs()
    {
    	int he=0,ta=1;
    	dl[0]=0;
    	while(he<ta)
    	{
    		int u=dl[he];
    		if(u==0||fa[u]==0)
    			fi[u]=0;
    		else
    			fi[u]=trs[fi[fa[u]]][fb[u]];
    		for(int i=0;i<94;i++)
    		{
    			if(trs[u][i])
    				dl[ta++]=trs[u][i];
    			else
    				trs[u][i]=trs[fi[u]][i];
    		}
    		he+=1;
    	}
    }
    

    FWT

    void fwtor(int sz[132000],int n)
    {
        for(int i=2;i<=n;i=(i<<1))
        {
            for(int j=0;j<n;j+=i)
            {
                for(int k=0;k<(i>>1);k++)
                    sz[j+(i>>1)+k]=(sz[j+(i>>1)+k]+sz[j+k])%md;
            }
        }
    }
    void ifwtor(int sz[132000],int n)
    {
        for(int i=2;i<=n;i=(i<<1))
        {
            for(int j=0;j<n;j+=i)
            {
                for(int k=0;k<(i>>1);k++)
                    sz[j+(i>>1)+k]=(sz[j+(i>>1)+k]-sz[j+k]+md)%md;
            }
        }
    }
    void fwtand(int sz[132000],int n)
    {
        for(int i=2;i<=n;i=(i<<1))
        {
            for(int j=0;j<n;j+=i)
            {
                for(int k=0;k<(i>>1);k++)
                    sz[j+k]=(sz[j+k]+sz[j+(i>>1)+k])%md;
            }
        }
    }
    void ifwtand(int sz[132000],int n)
    {
        for(int i=2;i<=n;i=(i<<1))
        {
            for(int j=0;j<n;j+=i)
            {
                for(int k=0;k<(i>>1);k++)
                    sz[j+k]=(sz[j+k]-sz[j+(i>>1)+k]+md)%md;
            }
        }
    }
    void fwtxor(int sz[132000],int n)
    {
        for(int i=2;i<=n;i=(i<<1))
        {
            for(int j=0;j<n;j+=i)
            {
                for(int k=0;k<(i>>1);k++)
                {
                    int a=sz[j+k],b=sz[j+(i>>1)+k];
                    sz[j+k]=(a+b)%md;
                    sz[j+(i>>1)+k]=(a-b+md)%md;
                }
            }
        }
    }
    void ifwtxor(int sz[132000],int n)
    {
        for(int i=2;i<=n;i=(i<<1))
        {
            for(int j=0;j<n;j+=i)
            {
                for(int k=0;k<(i>>1);k++)
                {
                    int a=sz[j+k],b=sz[j+(i>>1)+k];
                    sz[j+k]=1ll*(a+b)*inv%md;
                    sz[j+(i>>1)+k]=1ll*(a-b+md)*inv%md;
                }
            }
        }
    }
    

    KD树

    void update(int x)
    {
        if(bk[x])
            zx[x]=inf,wz[x]=-1;
        else
            zx[x]=qz[x],wz[x]=x;
        if(cl[x]!=0&&wz[cl[x]]!=-1&&zx[cl[x]]<=zx[x])
            zx[x]=zx[cl[x]],wz[x]=wz[cl[x]];
        if(cr[x]!=0&&wz[cr[x]]!=-1&&zx[cr[x]]<=zx[x])
            zx[x]=zx[cr[x]],wz[x]=wz[cr[x]];
    }
    void pur(int x,int y)
    {
        if(ld[x]!=-1&&y>=ld[x])
            return;
        ld[x]=y;
        if(qz[x]>y)qz[x]=y;
        if(zx[x]>y)zx[x]=y;
    }
    void pushdown(int x)
    {
        if(ld[x]==-1)return;
        if(cl[x]!=0)pur(cl[x],ld[x]);
        if(cr[x]!=0)pur(cr[x],ld[x]);
        ld[x]=-1;
    }
    void clean(int x)
    {
        if(fa[x]!=0)
            clean(fa[x]);
        pushdown(x);
    }
    void del(int x)
    {
        clean(x);
        bk[x]=true;
        for(int i=x;i!=0;i=fa[i])
            update(i);
    }
    int buix(SPx sz[70010],int l,int r);
    int buiy(SPx sz[70010],int l,int r);
    void pushup(int rt)
    {
        if(cl[rt]!=0)
        {
            lx[rt]=min(lx[rt],lx[cl[rt]]);rx[rt]=max(rx[rt],rx[cl[rt]]);
            ly[rt]=min(ly[rt],ly[cl[rt]]);ry[rt]=max(ry[rt],ry[cl[rt]]);
            fa[cl[rt]]=rt;
        }
        if(cr[rt]!=0)
        {
            lx[rt]=min(lx[rt],lx[cr[rt]]);rx[rt]=max(rx[rt],rx[cr[rt]]);
            ly[rt]=min(ly[rt],ly[cr[rt]]);ry[rt]=max(ry[rt],ry[cr[rt]]);
            fa[cr[rt]]=rt;
        }
    }
    bool fugai(int Lx,int Rx,int Ly,int Ry,int lx,int rx,int ly,int ry)
    {
        return Lx<=lx&&rx<=Rx&&Ly<=ly&&ry<=Ry;
    }
    bool fenli(int Lx,int Rx,int Ly,int Ry,int lx,int rx,int ly,int ry)
    {
        return Lx>rx||lx>Rx||Ly>ry||ly>Ry;
    }
    int X[70010],Y[70010];
    int buix(SPx sz[70010],int l,int r)
    {
        if(l>=r)return 0;
        qsort(sz+l,r-l,sizeof(SPx),cmpx);
        int m=(l+r-1)>>1,rt=sz[m].i;
        lx[rt]=rx[rt]=sz[m].x;
        ly[rt]=ry[rt]=sz[m].y;
        cl[rt]=buiy(sz,l,m);
        cr[rt]=buiy(sz,m+1,r);
        pushup(rt);
        return rt;
    }
    int buiy(SPx sz[70010],int l,int r)
    {
        if(l>=r)return 0;
        qsort(sz+l,r-l,sizeof(SPx),cmpy);
        int m=(l+r-1)>>1,rt=sz[m].i;
        lx[rt]=rx[rt]=sz[m].x;
        ly[rt]=ry[rt]=sz[m].y;
        cl[rt]=buix(sz,l,m);
        cr[rt]=buix(sz,m+1,r);
        pushup(rt);
        return rt;
    }
    void songc(int i,int Lx,int Rx,int Ly,int Ry,int z)
    {
        if(ld[i]!=-1&&z>ld[i])
            return;
        if(fenli(Lx,Rx,Ly,Ry,lx[i],rx[i],ly[i],ry[i]))
            return;
        if(fugai(Lx,Rx,Ly,Ry,lx[i],rx[i],ly[i],ry[i]))
        {
            pur(i,z);
            return;
        }
        pushdown(i);
        if(fugai(Lx,Rx,Ly,Ry,X[i],X[i],Y[i],Y[i]))
        {
            if(qz[i]>z)
                qz[i]=z;
            update(i);
        }
        if(cl[i]!=0)
            songc(cl[i],Lx,Rx,Ly,Ry,z);
        if(cr[i]!=0)
            songc(cr[i],Lx,Rx,Ly,Ry,z);
        update(i);
    }
    

    欧拉回路

    void dfs3(int u)
    {
        for(int i=fr[u];i!=-1;i=ne[i])
        {
            if(fr[u]==-1)break;//表已被清空
            fr[u]=ne[fr[u]];//当前弧优化
            if(!bk[i/2])
            {
                bk[i/2]=true;
                dfs3(v[i]);
                hl[sl++]=i;//回溯记录
            }
        }
    }
    

    线性基

        for(int i=0;i<=50;i++)
            zt[i]=-1;
        for(int i=0;i<n;i++)
        {
            ll t=sz[i];
            for(int j=50;j>=0;j--)
            {
                if(t&(1ll<<j))
                {
                    if(zt[j]==-1)
                    {
                        zt[j]=t;
                        break;
                    }
                    else
                        t=(t^zt[j]);
                }
            }
        }
        ll jg=0;
        for(int i=50;i>=0;i--)
        {
            if(zt[i]!=-1&&(jg^zt[i])>jg)
                jg=(jg^zt[i]);
        }
        printf("%lld",jg);
    

    强连通分量

    int dfn[MN],low[MN],tm=0,scc[MN],ss=0,st[MN],tp=0;
    void tarjan(int u)
    {
    	dfn[u]=low[u]=++tm;
    	st[tp++]=u;
    	for(int i=fr[u];i!=-1;i=ne[i])
    	{
    		int t=v[i];
    		if(!dfn[t])
    		{
    			tarjan(t);
    			low[u]=min(low[u],low[t]);
    		}
    		else if(!scc[t])
    			low[u]=min(low[u],dfn[t]);
    	}
    	if(dfn[u]==low[u])
    	{
    		ss+=1;
    		while(1)
    		{
    			scc[st[tp-1]]=ss;
    			tp-=1;
    			if(st[tp]==u)break;
    		}
    	}
    }
    

    FFT

    #include <stdio.h>
    #include <math.h>
    struct cp
    {
    	double a,b;
    	cp(){}
    	cp(double A,double B)
    	{
    		a=A;b=B;
    	}
    };
    cp operator+(cp x,cp y)
    {
    	return cp(x.a+y.a,x.b+y.b);
    }
    cp operator-(cp x,cp y)
    {
    	return cp(x.a-y.a,x.b-y.b);
    }
    cp operator*(cp x,cp y)
    {
    	return cp(x.a*y.a-x.b*y.b,x.a*y.b+x.b*y.a);
    }
    void FFT(cp sz[140000],int n,int lx)
    {
    	double pi=acos(-1.0);
    	for(int i=0,t=0;i<n;i++)
    	{
    		if(i>t)
    		{
    			cp o=sz[i];
    			sz[i]=sz[t];
    			sz[t]=o;
    		}
    		for(int j=(n>>1);(t^=j)<j;j=(j>>1));
    	}
    	for(int h=2;h<=n;h=(h<<1))
    	{
    		cp wn(cos(2*pi*lx/h),sin(2*pi*lx/h));
    		for(int i=0;i<n;i+=h)
    		{
    			cp t,w(1,0);
    			for(int j=i;j<i+(h>>1);j++,w=w*wn)
    			{
    				t=w*sz[j+(h>>1)];
    				sz[j+(h>>1)]=sz[j]-t;
    				sz[j]=sz[j]+t;
    			}
    		}
    	}
    	if(lx==-1)
    	{
    		for(int i=0;i<n;i++)
    		{
    			sz[i].a/=n;
    			sz[i].b=0;
    		}
    	}
    }
    cp sz[140000];
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    		int a;
    		scanf("%d",&a);
    		sz[i].a=a;
    		sz[i].b=0;
    	}
    	for(int i=1;;i=(i<<1))
    	{
    		if(i>=n)
    		{
    			n=i;
    			break;
    		}
    	}
    	FFT(sz,n,1);
    	FFT(sz,n,-1);
    	for(int i=0;i<n;i++)
    		printf("%d ",int(sz[i].a+0.2));
    	return 0;
    }
    

    Manacher

    	void man()
    	{
    		int ma=-1,wz=-1;
    		for(int i=0;i<n;i++)
    		{
    			cd[i]=1;
    			if(i<=ma)
    			{
    				cd[i]=cd[wz-(i-wz)];
    				if(i+cd[i]-1>ma)
    					cd[i]=ma-i+1;
    			}
    			while(i-cd[i]>=0&&i+cd[i]<n&&zf[i-cd[i]]==zf[i+cd[i]])
    				cd[i]+=1;
    			if(i+cd[i]-1>ma)
    			{
    				ma=i+cd[i]-1;
    				wz=i;
    			}
    		}
    	}
    

    KM最优完美匹配

    bool dfs(int u)
    {
        vg[u]=true;
        for(int i=0;i<n;i++)
        {
            if(vb[i])//只访问一次
                continue;
            int t=exg[u]+exb[i]-sz[u][i];
            if(t==0)//此边可用
            {
                vb[i]=true;
                if(pp[i]==-1||dfs(pp[i]))
                {
                    pp[i]=u;
                    return true;//找到增广路
                }
            }
            else
            {
                if(t<sl[i])//更新最小下降值
                    sl[i]=t;
            }
        }
        return false;
    }
    void KM()
    {
        for(int i=0;i<n;i++)
            pp[i]=-1;
        for(int i=0;i<n;i++)
        {
            exb[i]=0;
            exg[i]=-inf;
            for(int j=0;j<n;j++)
            {
                if(sz[i][j]>exg[i])
                    exg[i]=sz[i][j];
            }
        }//初始化
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                sl[j]=inf;
            while(1)
            {
                for(int j=0;j<n;j++)
                    vg[j]=vb[j]=false;
                if(dfs(i))
                    break;
                int zx=inf;
                for(int j=0;j<n;j++)
                {
                    if(!vb[j]&&sl[j]<zx)
                        zx=sl[j];//寻找最小下降值
                }
                for(int j=0;j<n;j++)
                {
                    if(vg[j])
                        exg[j]-=zx;
                    if(vb[j])
                        exb[j]+=zx;
                    else //更新最小下降值
                        sl[j]-=zx;
                }
            }
        }
    }
    
  • 相关阅读:
    转:关于C++ const 的全面总结
    HDOJ->考新郎(sdut1021)
    有些人笑着,其实心里哭的很疼
    HDU-2084 数塔
    SDUT2176 -> 递归的函数
    删数问题(SDUT2072 )
    微信2种access_token对比
    nginx配置C compiler cc is not found
    ftp无法连接的原因
    php的ftp类
  • 原文地址:https://www.cnblogs.com/lnzwz/p/12075113.html
Copyright © 2020-2023  润新知