二分图最大匹配:

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. Vue重修02

    1.v-for的优先级比v-if/v-show都大 v-bind也可以绑定自定义的属性 2.父组件向子组件传值 <!DOCTYPE html> <html lang="en ...

  2. HTML5_音视频标签 <audio> 和 <video>

    HTML5_音视频标签 <audio> 和 <video> audio 和 video 都是 inline行内元素 如果浏览器支持,则不显示标签文本 IE8 不支持 audio ...

  3. Linux 手册惯用的节名

    linux 手册将

  4. SQL - 2.基础语法

    一.SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GR ...

  5. c语言,以单词为单位逆序字符串

    #include "string.h" #include "stdio.h" char * nixu(char *c) { ; int n = strlen(c ...

  6. Zookeeper运维问题集锦

    实际工作中用到Zookeeper集群的地方很多, 也碰到过各种各样的问题, 在这里作个收集整理, 后续会一直补充; 其中很多问题的原因, 解决方案都是google而来, 这里只是作次搬运工; 其实很多 ...

  7. 学习ActiveMQ(八):activemq消息的持久化

    1. 持久化方式介绍前面我们也简单提到了activemq提供的插件式的消息存储,在这里再提一下,主要有以下几种方式: AMQ消息存储-基于文件的存储方式,是activemq开始的版本默认的消息存储方式 ...

  8. 对Vuex的初步了解

    文章转载于:http://www.cnblogs.com/wisewrong/p/6344390.html 在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props ...

  9. weblogic8控制台禁止(允许)访问配置方法

    由于现网上对外网开放,而weblogic控制台的信息和管理比较敏感,如果weblogic控制台被破解账户和密码登录, 面临的风险将是非常的大,所以一般现网部署时,要禁用掉weblogic控制台的访问. ...

  10. stm32f407以太网及USB OTG快速开发

    stm32f407以太网及USB OTG快速开发 引言 想要快速完成网络协议栈和USB OTG功能,使用ST自家的工具STM32CubMx再好不过的了.如果你还不会使用,别着急下面我会一步一步的用图片 ...