二分图最大匹配:

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. 17使用systemd方式开机自动启动Home Assistant服务

    2018-03-20 15:48:36 转移自网易博客! 首先使用编写文件hass@homeassistant.service,文件内容如下 # 这个文件用于systemd方式自动启动hass服务.# ...

  2. git HEAD detached from origin 问题的解决

    这个问题是因为分支选错了,所以说后续的提交都提交到了一个匿名分支之上,整个状态是游离了的 下面说一下我解决问题的步骤 1.查看在游离状态下提交的最新commit号 git branch -v 2.创建 ...

  3. python的array初识

    from array import array """ 'b' signed char int 1 'B' unsigned char int 1 'u' Py_UNIC ...

  4. word使用新技能

    office2013版,菜单栏-审阅-修订-所有标记,可以显示编辑过程中的所有修改步骤,还可查看未修改的原始状态.前提是“修订”按钮 要点亮! 给文档添加索引,并自动生成索引列表 文件-选项-显示-隐 ...

  5. amoeba实现读写分离

    amoeba的运行环境依靠java的jdk: 下面执行amoeba的安装不走 # mkdir /usr/local/src/amoeba 上传文件:amoeba-mysql-binary-2.2.0. ...

  6. Winform 关闭按钮

    问题:我希望树形导航目录窗体在打开一条记录后自动隐藏,然后再次点击主页面打开按钮的时候在自动显示,这样就能保证树形目录仍旧显示隐藏前的展开状态.这里遇到一个问题,就是点击窗体右上角的关闭按钮时,默认情 ...

  7. EASYUI combobox firefox 下取值为空的问题或不支持中文检索的问题

    输入中文包含数字 或者全部非中文是没问题的,这个是因为火狐浏览器输入中文输入法的时候 只能触发onkeyup而不能触发onkeydown的问题.而easyui渲染后赋值给隐藏input的过程需要 依赖 ...

  8. 防止enter提交表单

    如何防止回车(enter)键提交表单,其实很简单,就一句话.onkeydown="if(event.keyCode==13)return false;"把这句写在from标签里面就 ...

  9. SharePoint使用jsom查询当前用户信息

    前置环境:sharepoint 'use strict'; var context = SP.ClientContext.get_current(); var user = context.get_w ...

  10. 解决spring 用@Value注入配置时候出现中文乱码问题

    只要是乱码,很明显需要指定编码格式,为utf-8 <!-- 注解使用properties --> <bean id="configProperties" clas ...