1.KMP算法模板

#include <bits/stdc++.h>using namespace std;
const int N=100010,M=1000010;
char p[N],s[M];
int ne[N];
int main()
{int m,n;cin>>n>>p+1>>m>>s+1;for(int i=2,j=0;i<=n;i++){while(j&&p[i]!=p[j+1]) j=ne[j];if(p[i]==p[j+1]) j++;ne[i]=j;}for(int i=1,j=0;i<=m;i++){while(j&&s[i]!=p[j+1]) j=ne[j];if(s[i]==p[j+1]) j++;if(j==n){printf("%d ",i-j);j=ne[j];}}return 0;
}

2.Trie树:高效地存储和查找字符串集合的数据结构

#include <bits/stdc++.h>using namespace std;
const int N=100010;
int idx,son[N][26],cnt[N];
char str[N];
void insertt(char str[])
{int p=0;//开始指向根节点for(int i=0;str[i];i++){int u=str[i]-'a';if(!son[p][u]) son[p][u]=++idx;//没有这个分支就创建出来p=son[p][u];//p指向刚创建出来的新指针}cnt[p]++;//以p结尾的单词数+1
}
int query(char str[])
{int p=0;for(int i=0;str[i];i++){int u=str[i]-'a';if(!son[p][u]) return 0;p=son[p][u];}return cnt[p];
}
int main()
{int n;cin>>n;while(n--){char op[2];scanf("%s%s",op,str);if(op[0]=='I') insertt(str);else printf("%d\n",query(str));}return 0;
}

最大异或对

#include <bits/stdc++.h>using namespace std;
const int N=100010,M=31*N;
int a[N];
int idx,son[M][2];
void inserrt(int x)
{int p=0;for(int i=30;i>=0;i--){int u=x>>i&1;if(!son[p][u]) son[p][u]=++idx;p=son[p][u];}
}
int query(int x)
{int p=0,res=0;for(int i=30;i>=0;i--){int u=x>>i&1;if(son[p][!u]){p=son[p][!u];res=res*2+!u;}else{p=son[p][u];res=res*2+u;}}return res;
}
int main()
{int n;scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&a[i]);int res=0;for(int i=0;i<n;i++){inserrt(a[i]);int t=query(a[i]);res=max(res,a[i]^t);}printf("%d\n",res);return 0;
}

3.并查集:将两个集合合并或者询问两个数是否在一个集合中

基本原理:每个集合用一棵树表示,树根的编号就是集合的编号,每个节点存储他的父节点,p[x]表示x 的父节点
如何判断根节点:p[x]=x;
如何求x的集合编号:while(x!=p[x]) x=p[x];
如何合并两个集合:p[x]是x集合编号,p[y]是y集合编号,p[x]=y;

#include <bits/stdc++.h>using namespace std;
const int N=100010;
int p[N];
int findd(int x)//返回x的祖宗节点+路径压缩
{if(p[x]!=x) p[x]=findd(p[x]);return p[x];
}
int main()
{int n,m,a,b;char op[2];cin>>n>>m;for(int i=1;i<=n;i++) p[i]=i;while(m--){scanf("%s%d%d",&op,&a,&b);if(op[0]=='M'){p[findd(a)]=findd(b);}else{if(findd(a)==findd(b)) puts("Yes");else puts("No");}}return 0;
}

连通块中点的数量

#include <bits/stdc++.h>using namespace std;
const int N=100010;
int p[N],sizee[N];
int findd(int x)//返回x的祖宗节点+路径压缩
{if(p[x]!=x) p[x]=findd(p[x]);return p[x];
}
int main()
{int n,m,a,b;char op[2];cin>>n>>m;for(int i=1;i<=n;i++) {p[i]=i;sizee[i]=1;}while(m--){scanf("%s",op);if(op[0]=='C'){scanf("%d%d",&a,&b);if(findd(a)==findd(b)) continue;sizee[findd(b)]+=sizee[findd(a)];p[findd(a)]=findd(b);}else if(op[1]=='1'){scanf("%d%d",&a,&b);if(findd(a)==findd(b)) puts("Yes");else puts("No");}else{scanf("%d",&a);printf("%d\n",sizee[findd(a)]);}}return 0;
}

食物链——>妙啊

#include <bits/stdc++.h>using namespace std;
const int N=100010;
int d[N],p[N];
int findd(int x)//找根节点
{if(p[x]!=x)//如果x不是根节点{int t=findd(p[x]);//t位p[x]的根节点d[x]+=d[p[x]];//x到根节点的距离p[x]=t;//p[x]成为根节点}return p[x];
}
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) p[i]=i;int res=0;while(m--){int x,y,t;scanf("%d%d%d",&t,&x,&y);if(x>n||y>n) res++;else{int px=findd(x),py=findd(y);if(t==1){if(px==py&&(d[x]-d[y])%3!=0) res++;//xy在一个集合并且不是一类-》模3的余数不相同else if(px!=py)//不在同一个集合上{p[px]=py;d[px]=d[y]-d[x];}}else{if(px==py&&(d[x]-d[y]-1)%3!=0) res++;else if (px!=py){p[px]=py;d[px]=d[y]+1-d[x];}}}}printf("%d\n",res);return 0;
}

模板题——KMP Trie树 并查集相关推荐

  1. HDU 1512 Monkey King 左偏树 + 并查集

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1512 题意:有n个猴子,一开始每个猴子只认识自己.每个猴子有一个力量值,力量值越大表示这个猴子打架越厉害. ...

  2. 可持久化线段树【主席树】可持久化并查集【主席树+并查集】

    笼统的主席树原理 众所周知, 主席树是可以持久化的, 换言之你能知道你所维护信息的所有历史状态. 主席树是这样做的: 1. 首先建一颗朴素的线段树,代表初始状态 (下图黑色) , 也就是第0次操作后的 ...

  3. 数据结构(二)——Trie、并查集、堆

    前言 重学算法第5天,希望能坚持打卡不间断,从基础课开始直到学完提高课. 预计时长三个月内,明天再来!肝就完了 2月17日,day05 打卡 今日已学完y总的 算法基础课-2.3-第二章 数据结构(二 ...

  4. POJ - 2513 Colored Sticks(字典树+并查集+欧拉回路)

    题目链接:点击查看 题目大意:给出n个木棍,问若两两相连,最终能否构成一根长直木棍,相连的规则是两个木棍的相接端点的颜色需要保持相同 题目分析:关于这个题目,我们可以将每个木棍视为一条边,每个木棍的两 ...

  5. HDU 1512 Monkey King(左偏树+并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1512 题       意: 有n个猴子,一开始每个猴子只认识自己.每个猴子有一个力量值,力量值越大表示 ...

  6. 【BZOJ5005】乒乓游戏 [线段树][并查集]

    乒乓游戏 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 5 1 1 5 1 5 11 2 ...

  7. HDU2545 树上战争【树+并查集】

    树上战争 Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]

    Vladik and Entertaining Flags Time Limit: 20 Sec  Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...

  9. UVA 1455 Kingdom 线段树+并查集

    并查集维护:y的最大最小值.城市数量 线段树维护:城市数量,洲数量 合并两个集合时,先在线段树上删除两个子集合的旧的信息,然后再将合并完的新集合更新到线段树. //#pragma comment(li ...

  10. 408-数据结构-树的应用-哈夫曼树并查集

    哈夫曼树 哈夫曼实际上用于编码,使得编码长度达到最小,因为每一个字符在出现的概率上会有差异,针对出现概率大的用短的编码,出现概率小的用长编码,可以使得编码长度达到最小.编码过程使用二叉树实现. 带权路 ...

最新文章

  1. 如何用FAPROTAX预测微生物群落功能
  2. 即将开源 | 2亿用户背后的Flutter应用框架Fish Redux
  3. 4.11 一维到三维推广-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. pypthon3精要(16)-enumerate
  5. 石墨烯将是下一个万亿级别的产业,投资者该如何提前布局?
  6. d3.js 旋转图形_苏教版三年级数学上册6.1平移和旋转微课视频 | 练习
  7. [摘自MSDN] ASP.Net2.0学习 [2] 主题 1 :ASP.NET 主题和外观概述
  8. centos 安装 freeswitch,开启与关闭
  9. 最短路 HDU - 2544
  10. 那个分分钟处理 10 亿节点图计算的 Plato,现在怎么样了?
  11. python深拷贝和浅拷贝学习
  12. 九歌创作诗词计算机系统,人工智能辅助古诗词学习:以清华大学“九歌”诗词写作系统为例...
  13. assume用法及意思_assume的用法总结大全
  14. VMWARE虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机。
  15. va_list 原理以及用法
  16. 微信小程序基础(一) 文件结构配置项
  17. Docker_尚硅谷视频学习笔记
  18. 字节面试杂谈——计算机网络原理
  19. 英语单词如何正确发音?入股血赚!!!
  20. 201_DMA-BUF简单介绍

热门文章

  1. python 窗口键 键位码_Python制作AI贪吃蛇,很多很多细节、思路都写下来了
  2. Java使用Redis(jedis)
  3. 下载安装VS Code以及简单的配置使用
  4. 数据同步一致性_微服务架构:利用事件驱动实现最终一致性
  5. 如何做爬虫python在线观看_Python爬虫实战:利用scrapy,短短50行代码下载整站短视频...
  6. c语言实验报告1华科,华科操作系统实验报告
  7. NVM:使用nvm安装管理node版本
  8. SQL:pgsql中时间戳转换为整数
  9. $$str php,php中 $$str 中 "$$" 的详解,php中str详解_PHP教程
  10. lan pci 联想开机_我的联想电脑开机老显示DHCP