二分图最大匹配:

1.匈牙利算法:注意dfs中是dfs(c[w[i]]),搜索的是与之匹配的点。

 #include<cstdio>
#include<cstring> int n,m,x,y,fi[],w[],ne[],cnt,c[],ans;
bool b[]; void add(int u,int v)
{
w[++cnt]=v;ne[cnt]=fi[u];fi[u]=cnt;
} bool dfs(int u)
{
for(int i=fi[u];i;i=ne[i])
if(!b[w[i]])
{
b[w[i]]=;
if(!c[w[i]] || dfs(c[w[i]]))
{
c[w[i]]=u;return ;
}
}
return ;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
scanf("%d",&m);cnt=;
memset(fi,,sizeof(fi));
memset(c,,sizeof(c));
for(int i=;i<=m;i++) scanf("%d%d",&x,&y),add(x,y);
for(int i=;i<=n;i++)
{
memset(b,,sizeof(b));
if(dfs(i)) ans++;
}
printf("%d\n",ans);
}
return ;
}

匈牙利算法

2.dinic算法:速度优于匈牙利算法,但是加边时需要区分两边的点。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std; int n,m,x,y,fi[],w[],ne[],v[],cnt,ans,dis[]; queue<int> q; int read()
{
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<='') {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} void add(int u,int vv,int val)
{
w[++cnt]=vv;ne[cnt]=fi[u];fi[u]=cnt;v[cnt]=val;
w[++cnt]=u;ne[cnt]=fi[vv];fi[vv]=cnt;v[cnt]=val;
} bool bfs()
{
memset(dis,-,sizeof(dis));
dis[]=;q.push();
while(!q.empty())
{
int k=q.front();q.pop();
for(int i=fi[k];i;i=ne[i])
if(v[i]> && dis[w[i]]==-)
{
dis[w[i]]=dis[k]+;
q.push(w[i]);
}
}
return dis[n*+]==- ? :;
} int dfs(int u,int vv)
{
if(u==n*+) return vv;
int kkz,now=;
for(int i=fi[u];i;i=ne[i])
if(dis[w[i]]==dis[u]+ && v[i]> && (kkz=dfs(w[i],min(vv-now,v[i]))))
{
v[i]-=kkz;v[i^]+=kkz;now+=kkz;
if(now==vv) return now;
}
if(!now) dis[u]=-;
return now;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
m=read();cnt=;ans=;
memset(fi,,sizeof(fi));
for(int i=;i<=m;i++) x=read(),y=read(),add(x,y+n,);
for(int i=;i<=n;i++) add(,i,),add(i+n,*n+,);
while(bfs()) ans+=dfs(,);
printf("%d\n",ans);
}
return ;
}

dinic算法

欧拉函数:

1.公式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。

 ans=n;
for(int i=;i*i<=n;i++)
if(!(n%i))
{
while(!(n%i)) n/=i;ans=ans/i*(i-);
}
if(n!=) ans=ans/n*(n-);

公式

2.线性筛:

 phi[]=;
for(int i=;i<=n;i++)
{
if(!b[i]) a[++a[]]=i,phi[i]=i-;
for(int j=;a[j]*i<=n && j<=a[];j++)
{
b[i*a[j]]=;
if(!(i%a[j]))
{
phi[i*a[j]]=phi[i]*a[j];break;
}
phi[i*a[j]]=phi[i]*phi[a[j]];
}
}

线性筛

莫比乌斯函数:

 u[]=;
for(int i=;i<=n;i++)
{
if(!b[i]) q[++q[]]=i,u[i]=-;
for(int j=;j<=q[] && i*q[j]<=n;j++)
{
b[i*q[j]]=;
if(!(i%q[j]))
{
u[i*q[j]]=;break;
}
u[i*q[j]]=-u[i];
}
}

莫比乌斯函数

线性基:线性基的异或和是序列的最大异或和。

1.单区间:

 for(int i=;i<=n;i++)
for(int j=;~i;i--)
if(a[i]&(<<j))
{
if(f[j]) a[i]^=f[j];
else
{
f[j]=a[i];break;
}
}

单区间线性基

2.多区间:f[i]表示区间[i,n]的线性基。

 struct node{
int x,id;
}f[N][],tmp; for(int i=n;i;i--)
{
memcpy(f[i],f[i+],sizeof(f[i+]));
tmp=(node){a[i],i};
for(int j=;~j;j--)
if(tmp.x&(<<j))
{
if(!f[i][j].x) swap(tmp,f[i][j]);
else
{
if(f[i][j].id>tmp.id) swap(tmp,f[i][j]);
tmp.x^=f[i][j].x;
}
}
}

多区间线性基

扩展欧几里得算法解二元一次方程:

 int gcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=;y=;return a;
}
int k=gcd(b,a%b,x,y),z=y;
y=x-a/b*y;x=z;
return k;
} void getans(int a,int b,int c,int &x,int &y)
{
int k=c/gcd(a,b,x,y);
x*=k;y*=k;
}

二元一次方程

FFT:

1.使用STL里面的complex,比较方便:

 #define E complex<double>
#define pi acos(-1) void fft(E *u,int v)
{
for(int i=;i<n;i++) if(r[i]>i) swap(u[r[i]],u[i]);
for(int i=;i<n;i<<=)
{
E wn(cos(pi/i),v*sin(pi/i));
for(int j=;j<n;j+=(i<<))
{
E w(,);
for(int k=;k<i;k++,w=w*wn)
{
E x=u[j+k],y=u[i+j+k]*w;
u[j+k]=x+y;u[i+j+k]=x-y;
}
}
}
if(v==-) for(int i=;i<n;i++) u[i]/=n;
} int main()
{
n=read();for(int i=;i<=n;i++) a[i]=read();
m=read();for(int i=;i<=m;i++) b[i]=read();
m+=n;
for(n=;n<=m;n<<=) l++;
for(int i=;i<n;i++) r[i]=(r[i>>]>>)|((i&)<<(l-));
fft(a,);fft(b,);
for(int i=;i<n;i++) a[i]=a[i]*b[i];
fft(a,-);
for(int i=;i<n;i++) c[i]=(int)(a[i].real()+0.5);
}

STLcomplex FFT

2.struct定义complex型,要比STL快:

 #define pi acos(-1)

 int n,m,l,r[N];

 struct E{
double a,b;
E() {}
E(double aa,double bb):a(aa),b(bb) {}
E operator + (const E&u) const {return E(a+u.a,b+u.b);}
E operator - (const E&u) const {return E(a-u.a,b-u.b);}
E operator * (const E&u) const {return E(a*u.a-b*u.b,a*u.b+b*u.a);}
E operator !() const {return E(a,-b);}
}a[N],b[N]; void fft(E *u,int v)
{
for(int i=;i<n;i++) if(r[i]>i) swap(u[r[i]],u[i]);
for(int i=;i<n;i<<=)
{
E wn(cos(pi/i),v*sin(pi/i));
for(int j=;j<n;j+=(i<<))
{
E w(,);
for(int k=;k<i;k++,w=w*wn)
{
E x=u[j+k],y=u[i+j+k]*w;
u[j+k]=x+y;u[i+j+k]=x-y;
}
}
}
if(v==-) for(int i=;i<n;i++) u[i].a/=n;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i].a);
for(int i=;i<=n;i++) scanf("%d",&b[i].a);
m+=n;
for(n=;n<=m;n<<=) l++;
for(int i=;i<l;i++) r[i]=(r[i>>]>>)|((i&)<<(l-));
fft(a,);fft(b,);
for(int i=;i<n;i++) a[i]=a[i]*b[i];
fft(a,-);
for(int i=;i<n;i++) c[i]=(int){a[i].a+0.5};
}

手写complex FFT

KDtree:

1.求最小值,带更新:

 #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 999999999 int n,m,opt,x,y,root,kkz,ans; struct node{
int a[],mx[],mn[],l,r;
}a[],c[],kkzv,T; int read()
{
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<='') {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} bool operator < (node u,node v)
{
return u.a[kkz]<v.a[kkz];
} int abs(int u)
{
return u< ? -u:u;
} int dis(node u,node v)
{
return abs(u.a[]-v.a[])+abs(u.a[]-v.a[]);
} void update(int u)
{
node l=c[c[u].l],r=c[c[u].r];
for(int i=;i<;i++)
{
if(c[u].l) c[u].mx[i]=max(c[u].mx[i],l.mx[i]),c[u].mn[i]=min(c[u].mn[i],l.mn[i]);
if(c[u].r) c[u].mx[i]=max(c[u].mx[i],r.mx[i]),c[u].mn[i]=min(c[u].mn[i],r.mn[i]);
}
} int build(int l,int r,int now)
{
kkz=now;
int mid=l+r>>;
nth_element(a+l,a+mid,a+r+);
c[mid]=a[mid];
for(int i=;i<;i++) c[mid].mn[i]=c[mid].mx[i]=c[mid].a[i];
if(l<mid) c[mid].l=build(l,mid-,now^);
if(r>mid) c[mid].r=build(mid+,r,now^);
update(mid);
return mid;
} int get(int k,node u)
{
int now=;
for(int i=;i<;i++) now+=max(,c[k].mn[i]-u.a[i]);
for(int i=;i<;i++) now+=max(,u.a[i]-c[k].mx[i]);
return now;
} void insert(int k,int now)
{
if(T.a[now]>=c[k].a[now])
{
if(c[k].r) insert(c[k].r,now^);
else
{
c[k].r=++n;c[n]=T;
for(int i=;i<;i++) c[n].mn[i]=c[n].mx[i]=c[n].a[i];
}
}
else
{
if(c[k].l) insert(c[k].l,now^);
else
{
c[k].l=++n;c[n]=T;
for(int i=;i<;i++) c[n].mn[i]=c[n].mx[i]=c[n].a[i];
}
}
update(k);
} void query(int k)
{
int d,dl=inf,dr=inf;
d=dis(c[k],T);
ans=min(ans,d);
if(c[k].l) dl=get(c[k].l,T);
if(c[k].r) dr=get(c[k].r,T);
if(dl<dr)
{
if(dl<ans) query(c[k].l);
if(dr<ans) query(c[k].r);
}
else
{
if(dr<ans) query(c[k].r);
if(dl<ans) query(c[k].l);
}
} int query(node p)
{
ans=inf;T=p;
query(root);
return ans;
} int main()
{
n=read();m=read();
for(int i=;i<=n;i++) a[i].a[]=read(),a[i].a[]=read();
root=build(,n,);
while(m--)
{
opt=read();kkzv.a[]=read();kkzv.a[]=read();
if(opt==) T=kkzv,insert(root,);
else printf("%d\n",query(kkzv));
}
return ;
}

min带修改

2.求最大值的cal函数:

 int cal(int u)
{
int now=;
for(int k=;k<;k++) now+=max(abs(c[u].mx[k]-tmp.a[k]),abs(c[u].mn[k]-tmp.a[k]));
return now;
}

cal_max函数

KMP:

 #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; const int N=; int t,n,next[N],len1,len2;
char s1[N],s2[N]; int cal()
{
int k=,ans=;
for(int i=;i<=len1;i++)
{
while(k> && s1[k+]!=s1[i]) k=next[k];
if(s1[k+]==s1[i]) k++;
next[i]=k;
}
k=;
for(int i=;i<=len2;i++)
{
while(k> && s1[k+]!=s2[i]) k=next[k];
if(s1[k+]==s2[i]) k++;
if(k==len1) ans++,k=next[k];
}
return ans;
} int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s%s",s1+,s2+);
len1=strlen(s1+);len2=strlen(s2+);
printf("%d\n",cal());
}
return ;
}

KMP

mika的模板库的更多相关文章

  1. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

  2. c++转载系列 std::vector模板库用法介绍

    来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...

  3. Handlebars模板库浅析

    Handlebars模板库简单介绍 Handlebars是JavaScript一个语义模板库,通过对view(模板)和data(ajax请求的数据,一般是json)的分离来快速构建Web模板.它采用& ...

  4. 【转】C++标准库和标准模板库

    C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...

  5. STL标准模板库介绍

    1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...

  6. c++模板库(简介)

    目 录 STL 简介 ......................................................................................... ...

  7. 【c++】标准模板库STL入门简介与常见用法

    一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...

  8. C++——string类和标准模板库

    一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...

  9. STL 简介,标准模板库

    这篇文章是关于C++语言的一个新的扩展--标准模板库的(Standard Template Library),也叫STL.  当我第一次打算写一篇关于STL的文章的时候,我不得不承认我当时低估了这个话 ...

随机推荐

  1. How to change Eclipse loading image

    Eclipse IDE has many customize components, the splash welcome image (purple color loading image) is ...

  2. 更新node和npm到最新版本

    卸载 1.首先卸载nodejs,打开控制面板,然后找到程序卸载: 2.找到npm目录和npmcache 目录,直接删掉(一般情况下会在C:\Users\Caffrey\AppData\Roaming\ ...

  3. [LeetCode] Binary Search 二分搜索法

    Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...

  4. ajax 传递中文字符参数 问题

    使用ajax 传递中文字符串时, 服务端会接收不到预期的 中文字符. 此时,需要对 js中的中文字符参数进行 编码,  到达服务端后, 再为其解码 即可. 前端: var url = '....'; ...

  5. Nestjs 微服务

    文档 工作示例 安装: $ npm i --save @nestjs/microservices main.ts import { NestFactory } from '@nestjs/core'; ...

  6. Nmap 进阶使用 [ 脚本篇 ]

    0×01 前言 因为今天的重点并非nmap本身的使用,主要还是想借这次机会给大家介绍一些在实战中相对比较实用的nmap脚本,所以关于nmap自身的一些基础选项就不多说了,详情可参考博客端口渗透相关文章 ...

  7. php发送邮箱

    /** * 系统邮件发送函数 * @param string $tomail 接收邮件者邮箱 * @param string $name 接收邮件者名称 * @param string $subjec ...

  8. mysql千万级数据量查询出所有重复的记录

    查询重复的字段需要创建索引,多个条件则创建组合索引,各个条件的索引都存在则不必须创建组合索引 有些情况直接使用GROUP BY HAVING则能直接解决:但是有些情况下查询缓慢,则需要使用下面其他的方 ...

  9. JS操作字符串

    JS操作字符串 1.函数:split() 把字符串按分隔符分割成数组. 语法:字符串.split(separator,limit); separator:分隔符. 功能:使用一个指定的分隔符把一个字符 ...

  10. 干货|爱奇艺CDN巡检系统技术解析

    小结: 1. 中心处理系统 /1/将定制后的巡检任务拆分,通过配置与任务分发系统.CMDB*( configuration management database)将派发到边缘拨测系统/2/处理边缘拨 ...