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. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理

    令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...

  2. 【CTF WEB】GCTF-2017读文件

    读文件 只给了个1.txt可以读,试了一下加*不行,感觉不是命令执行,"../"返回上级目录也不行,猜测可能过滤了什么,在1.txt中间加上"./"发现仍能读取 ...

  3. XSS注入常用语句

    <script>alert('hello,gaga!');</script> //经典语句,哈哈! >"'><img src="javas ...

  4. 【转】GridView 加载空行并点击编辑每一个单元格

    代码 <script runat="server"> protectedvoid Button1_Click(object sender, System.EventAr ...

  5. 【转载】ajaxFileUpload 报这错jQuery.handleError is not a function

    今天刚打个一个技术群,里面有人问标题上的问题,嘿,我恰好遇过,现在大家至少也在用jquery1.9以上的版本,ajaxfileupload的版本早就不更新了,大家可以下载看:地址这里,它例子里使用的J ...

  6. Django 内置模板标签和过滤器

    一.内置模板标签 语法:{%  %} autoescape : 是否转义,on或off作为参数,并确定自动转义是否在块内有效.该块以endautoescape结束 {% autoescape on % ...

  7. maven profile 优先级

    maven profile是有优先级别 也就是说在setting.xml的profile优先级比pom中同名的profile高. 可以使用 mvn help:active-profiles 这个命令是 ...

  8. 02 How to Write Go Code 如何编写go语言代码

    How to Write Go Code   如何编写go语言代码 Introduction   介绍 Code organization  组织代码 Overview  概述 Workspaces  ...

  9. ASP.NET MVC5 支持PUT 和DELETE

    Web.config <configuration> <system.webServer> <handlers> <remove name="Ext ...

  10. json的用法

    json格式 JSON格式:http://www.json.org/ python和JSON的关系请参考:http://docs.python.org/library/json.html JSON建构 ...