查并集 :
合并: void uion(int x,int y)
{ int i=found(x);
int j=found(y);
fa[i]=j;
}
查询: int find(int x)
{ if(fa[x]==x) return x;
return fa[x]=found(fa[x]); //路径压缩
}
归并排序:
#include "stdio.h"
long long a[100005],n,b[100005];
void bin(long long l,long long r)
{
int i,j,k=1,mid;
i=l;
mid=(l+r)/2;
j=mid+1;
while(i<=mid&&j<=r)
{
if(a[i]>a[j]) b[k++]=a[j++];
else b[k++]=a[i++];
}
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(int i=1;i<k;i++) a[i+l-1]=b[i]; //重点
}
void gui(long long l,long long r)
{ int i,j,mid;
if(l>=r) return;
mid=(l+r)/2;
gui(l,mid);
gui(mid+1,r);
bin(l,r);
}
main()
{ int i,j;
scanf("%lld",&n);
for(i=1;i<=n;i++)
scanf("%lld",a+i);
gui(1,n);
for(i=1;i<=n;i++)
if(i==n) printf("%lld\n",a[i]);
else printf("%lld ",a[i]);
}
KMP:
#include "stdio.h"
void zuichang() //求最长前缀表
{
int i,j,len;
len=strlen(b);
j=0; next[0]=0;
for(i=1;i<len;i++)
{
while(j>0&&b[i]!=b[j]) j=next[j-1];
if(b[i]==b[j]) j++;
next[i]=j;
}
}
void getnext() //求next数组
{
int i,j,len,k;
len=strlen(b);
next[0]=-1;
k=-1;
j=0;
while(j<len-1)
{
if(k==-1||b[k]==b[j])
{
k++;
j++;
next[j]=k;
}
else k=next[k];
}
}
main()
{
int i,j,lena,lenb;
lena=strlen(a);
lenb=strlen(b);
i=0; j=0;
while(i<lena&&j<lenb)
{
if(a[i]==b[j]||j==-1) {i++; j++;}
else j=next[j];//利用next数组求解
}
if(j==lena) printf("%d",i-j+1);
}
main()
{
int i,j,lena,lenb;
lena=strlen(a);
lenb=strlen(b);
i=0; j=0;
while(i<lena&&j<lenb)
{
if(a[i]==b[j]||j==0) {i++; j++;}
else j=next[j-1]; //利用最长前缀表求解,但是好像有点我找不出来的小错误,洛谷上AC不了,只能以后深究
}
if(j==lena) printf("%d",i-j+1);
}