Hash:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#define REP(i,k,n) for(long long i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline long long read(){
long long x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
long long ha[];
long long n,m,S;
char s[],t[];
long long sum[],poww[];
long long k=1e9,k1=1e7;
int main(){
scanf("%s%s",s+,t+);
n=strlen(s+),m=strlen(t+);
poww[]=;
REP(i,,n) poww[i]=(poww[i-]*k)%k1;
REP(i,,n) sum[i]=(sum[i-]*k+(s[i]-'a'))%k1;
REP(i,,m) S=(S*k+(t[i]-'a'))%k1;
REP(i,m,n)
if(S%k1==(sum[i]-sum[i-m]*poww[m])%k1) cout<<i<<endl;
}

Kmp:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int n,m;
char s[],t[];
int nxt[];
void getnxt(){
int j=;
nxt[]=;
REP(i,,m){
while(t[i+]!=t[j+] && j!=) j=nxt[j];
if(t[i+]==t[j+]) nxt[i+]=j+,j++;
else nxt[i+]=;
}
}
void pipei(){
int j=;
REP(i,,n){
while(s[i+]!=t[j+] && j!=) j=nxt[j];
if(s[i+]==t[j+]) j++;
if(j==m) cout<<i<<endl,j=nxt[j];
}
}
int main(){
scanf("%s%s",s+,t+);
n=strlen(s+),m=strlen(t+);
getnxt();
pipei();
}

AC-automata machine:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
queue <int> Q;
int n;
int tree[][],total=,isend[],nxt[];
char t[],s[];
void insert(char *s){
int l=strlen(s+),u=;
REP(i,,l){
if(!tree[u][s[i]-'a']) tree[u][s[i]-'a']=++total;
u=tree[u][s[i]-'a'];
}
isend[u]=;
return ;
}
void getnxt(){
REP(i,,) tree[][i]=;
Q.push(),nxt[]=;
while(!Q.empty()){
int u=Q.front();Q.pop();
REP(i,,)
if(!tree[u][i]) tree[u][i]=tree[nxt[u]][i];
else nxt[tree[u][i]]=tree[nxt[u]][i],Q.push(tree[u][i]);
}
return ;
}
void search(){
int u=;
REP(i,,strlen(s+)){
int j=tree[u][s[i]-'a'],ans=;
while(j>) ans+=isend[j],isend[j]=,j=nxt[j];
u=tree[u][s[i]-'a'];
if(ans) cout<<i<<endl;
}
}
int main(){
in(n);
REP(i,,n) scanf("%s",t+),insert(t);
getnxt();
scanf("%s",s+);
search();
}

 SPFA:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
queue <int> Q;
int n,m;
int total,head[],to[],nxt[],val[],dis[],vis[];
void adl(int a,int b,int c){
total++;
to[total]=b;
val[total]=c;
nxt[total]=head[a];
head[a]=total;
return ;
}
void SPFA(){
memset(dis,,sizeof(dis));
Q.push(),dis[]=;
while(!Q.empty()){
int u=Q.front();Q.pop();vis[u]=;
for(int e=head[u];e;e=nxt[e])
if(dis[to[e]]>dis[u]+val[e]){
dis[to[e]]=dis[u]+val[e];
if(!vis[to[e]]){
vis[to[e]]=;
Q.push(to[e]);
}
}
}
return ;
}
int main(){
in(n),in(m);
int a,b,c;
REP(i,,m) in(a),in(b),in(c),adl(a,b,c);
SPFA();
REP(i,,n) cout<<dis[i]<<" ";
}

Dijkstra:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int n,m;
int total,head[],to[],nxt[],val[];
int vis[],dis[];
struct node{
int ind,val;
};
priority_queue <node> Q;
bool operator < (node a,node b){
return a.val>b.val;
}
void adl(int a,int b,int c){
total++;
to[total]=b;
val[total]=c;
nxt[total]=head[a];
head[a]=total;
return ;
}
void Dijkstra(){
memset(dis,,sizeof(dis));
Q.push(node{,});dis[]=;
while(!Q.empty()){
int u=Q.top().ind;Q.pop();vis[u]=;
for(int e=head[u];e;e=nxt[e])
if(dis[to[e]]>dis[u]+val[e]){
dis[to[e]]=dis[u]+val[e];
Q.push(node{to[e],dis[to[e]]});
}
}
return ;
}
int main(){
in(n),in(m);
int a,b,c;
REP(i,,m) in(a),in(b),in(c),adl(a,b,c);
Dijkstra();
REP(i,,n) cout<<dis[i]<<" ";
}

Negative ring:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int n,m;
int total,head[],to[],nxt[],val[];
int dis[],vis[];
void adl(int a,int b,int c){
total++;
to[total]=b;
val[total]=c;
nxt[total]=head[a];
head[a]=total;
return ;
}
void dfs(int u){
for(int e=head[u];e;e=nxt[e]){
if(dis[to[e]]>dis[u]+val[e]){
dis[to[e]]=dis[u]+val[e];
if(!vis[to[e]]){
vis[to[e]]=;
dfs(to[e]);
vis[to[e]]=;
}
else cout<<"polite",exit();
}
}
return ;
}
int main(){
in(n),in(m);
int a,b,c;
REP(i,,m) in(a),in(b),in(c),adl(a,b,c);
dis[]=;
dfs();
}

Get negative Ring:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int n,m;
int total,head[],to[],nxt[],val[];
int dis[],vis[],book[];
stack <int> S;
void adl(int a,int b,int c){
total++;
to[total]=b;
val[total]=c;
nxt[total]=head[a];
head[a]=total;
return ;
}
void dfs(int u){
book[u]=;
for(int e=head[u];e;e=nxt[e]){
if(dis[to[e]]>dis[u]+val[e]){
dis[to[e]]=dis[u]+val[e];
if(!vis[to[e]]){
vis[to[e]]=;
S.push(to[e]);
dfs(to[e]);
S.pop();
vis[to[e]]=;
}
else{
while(!S.empty() && S.top()!=to[e]) cout<<S.top()<<" ",S.pop();
cout<<S.top(),S.pop(),exit();
}
}
}
return ;
}
int main(){
in(n),in(m);
int a,b,c;
REP(i,,m) in(a),in(b),in(c),adl(a,b,c);
REP(i,,n) if(!book[i]) S.push(i),vis[i]=,memset(dis,,sizeof(dis)),dfs(i);
S.push();
}
/*
4 5
1 2 1
2 3 -1
3 1 -2
3 4 2
1 4 3
*/

 lowest common ancestor:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int n,m;
int total,head[],to[],nxt[];
int tree[][],depth[];
inline void adl(int a,int b){
total++;
to[total]=b;
nxt[total]=head[a];
head[a]=total;
return ;
}
inline void dfs(int u,int fa){
REP(i,,) tree[u][i]=tree[tree[u][i-]][i-];
for(int e=head[u];e;e=nxt[e])
if(to[e]!=fa){
depth[to[e]]=depth[u]+;
tree[to[e]][]=u;
dfs(to[e],u);
}
return ;
}
inline int lca(int u,int v){
if(depth[u]<depth[v]) swap(u,v);
int d=depth[u]-depth[v];
for(int i=;(<<i)<=d;i++) if((<<i) & d) u=tree[u][i];
if(u==v) return u;
for(int i=;i>=;i--) if(tree[u][i]!=tree[v][i]) u=tree[u][i],v=tree[v][i];
return tree[u][];
}
int main(){
in(n);
int a,b;
REP(i,,n-) in(a),in(b),adl(a,b),adl(b,a);
depth[]=,dfs(,);
in(m);
REP(i,,m){
in(a),in(b);
printf("%d\n",lca(a,b));
}
return ;
}

binary index tree:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int n,m;
int tree[];
inline void add(int i,int a){
for(;i<=n;i+=(i&-i)) tree[i]+=a;
return ;
}
inline int get(int i){
int ans=;
for(;i>;i-=(i&-i)) ans+=tree[i];
return ans;
}
int main(){
in(n);
int a,b,p;
REP(i,,n) in(a),add(i,a);
in(m);
REP(i,,m){
in(p);
if(p==) in(a),in(b),add(a,b);
else in(a),in(b),printf("%d\n",get(b)-get(a-));
}
}
/*
3
1 2 3
100
1 2 5
*/

ST table:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int n,m,a,b;
int s[][];
int Log[];
int main(){
in(n);
REP(i,,n) in(s[i][]);
REP(j,,)
for(int i=;i+(<<j-)<=n;i++)
s[i][j]=min(s[i][j-],s[i+(<<j-)][j-]);
Log[]=;
REP(i,,) Log[i]=Log[i>>]+;
in(m);
REP(i,,m){
in(a),in(b);
int x=Log[b-a+];
cout<<x<<" "<<b-(<<x)+<<endl;
cout<<min(s[a][x],s[b-(<<x)+][x])<<endl;
}
return ;
}

 exgcd:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int a,b,d,x,y,t;
void exgcd(int a,int b,int &d,int &x,int &y){
if(b==) x=,y=,d=a;
else exgcd(b,a%b,d,x,y),t=x,x=y,y=t-a/b*y;
return ;
}
int main(){
in(a),in(b);
exgcd(a,b,d,x,y);
cout<<x<<" "<<y<<endl;
}

持续更新......

dititally DP:

Chinese remainder theorem:

 

NOIP 算法模板的更多相关文章

  1. 匈牙利 算法&模板

    匈牙利 算法 一. 算法简介 匈牙利算法是由匈牙利数学家Edmonds于1965年提出.该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. 二分图的定义: 设G=(V,E)是一个 ...

  2. Tarjan 算法&模板

    Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...

  3. hdu 2255 奔小康赚大钱--KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...

  4. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  5. poj 1274 The Perfect Stall【匈牙利算法模板题】

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20874   Accepted: 942 ...

  6. NOIP算法总结与复习

    NOIP算法总结与复习 (看了看李总的蓝皮书,收获颇多,记下此文,以明志--) (一)数论 1.最大公约数,最小公倍数 2.筛法球素数 3.mod规律公式 4.排列组合数,错排 5.Catalan数 ...

  7. 最短路径---dijkstra算法模板

    dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 #include<stdio.h> #include<stri ...

  8. 算法模板学习专栏之总览(会慢慢陆续更新ing)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  9. POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]

    妖怪题目,做到现在:2017/8/19 - 1:41…… 不过想想还是值得的,至少邻接矩阵型的Dinic算法模板get√ 题目链接:http://poj.org/problem?id=1815 Tim ...

随机推荐

  1. 建立ARM交叉编译环境 (arm-none-linux-gnueabi-gcc with EABI)【转】

    转自:http://lib.csdn.net/article/embeddeddevelopment/60172?knId=886 建立ARM交叉编译环境 (arm-none-linux-gnueab ...

  2. Asp.Net使用百度编辑器(ueditor)

    1.  1.4.3以上版本将不再承诺支持ie6/ie7. 2.如果是aspx 需要加上  ValidateRequest="false" 3.Web.config <syst ...

  3. 使用离线包部署kubernetes 1.9.0、kubernetes-dashboard 1.8

    =============================================== 2018/3/22_第2次修改                       ccb_warlock 更新 ...

  4. SQLAlchemy-介绍安装

    一:概述 SQLAlchemy的SQL工具包和对象关系映射是一个全面的工具集,用来处理数据库和Python. 它有几个不同的功能领域,可以单独使用或组合使用. 所示的主要组件,组件依赖关系组织成层: ...

  5. python网络编程--事件驱动模型

    论事件驱动与异步IO 事件驱动模型:根据事件的触发去干什么事,就是根据一个事件做反应 原文:http://www.cnblogs.com/alex3714/articles/5248247.html常 ...

  6. Web 2.0应用客户端性能问题十大根源《转载》

    前言 Web 2.0应用的推广为用户带来了全新的体验,同时也让开发人员更加关注客户端性能问题.最近,资深Web性能诊断专家.知名工具dynatrace的创始人之一Andreas Grabner根据自己 ...

  7. ThinkPHP中的四种路由形式

    1.普通形式路由(get形式路由) 路由形式:http://网址/入库文件?m=分组&c=控制器&c=控制器&a=方法名&参数=参数 例子:http://localho ...

  8. Luogu P1160 【队列安排】

    详细的链表讲解 很明显的一个链表裸题 和普通的链表有一个区别就是这个题 可以O(1)插入,O(1)查询 然后我们为了方便,采用双向链表,定义s.f作为指针数组 更详细的解释见代码 #include&l ...

  9. abtest分流随机链接方法(javascript)

    ¶¹¸¯¸ÉËêµÄ·¨¹úµçÊÓ¸²¸Ç --> 代码如下 <!DOCTYPE HTML> <html> <head> <script type=& ...

  10. poj1182 食物链(带权并查集)

    题目链接 http://poj.org/problem?id=1182 思路 前面做的带权并查集的权值记录该结点与其父结点是否是同一类,只有两种取值情况(0,1),在这题中某结点a和其父结点b的取值共 ...