来自北京大学NOIP金牌选手yxc的常用代码模板2——数据结构

本文介绍了C++中的队列、单调栈、KMP算法、Trie树、并查集、堆以及哈希技术,包括拉链法和开放寻址法,并提及了Java开发的学习资源,重点突出了算法在实际项目中的应用和面试中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

q[hh];

// 判断队列是否为空

if (hh <= tt)

{

}

(2). 循环队列

// hh 表示队头,tt表示队尾的后一个位置

int q[N], hh = 0, tt = 0;

// 向队尾插入一个数

q[tt ++ ] = x;

if (tt == N) tt = 0;

// 从队头弹出一个数

hh ++ ;

if (hh == N) hh = 0;

// 队头的值

q[hh];

// 判断队列是否为空

if (hh != tt)

{

}

5.单调栈

常见模型:找出每个数左边离它最近的比它大/小的数

int tt = 0;

for (int i = 1; i <= n; i ++ )

{

while (tt && check(stk[tt], i)) tt – ;

stk[ ++ tt] = i;

}

6. 单调队列

常见模型:找出滑动窗口中的最大值/最小值

int hh = 0, tt = -1;

for (int i = 0; i < n; i ++ )

{

while (hh <= tt && check_out(q[hh])) hh ++ ; // 判断队头是否滑出窗口

while (hh <= tt && check(q[tt], i)) tt – ;

q[ ++ tt] = i;

}

7.KMP

// s[]是长文本,p[]是模式串,n是s的长度,m是p的长度

求模式串的Next数组:

for (int i = 2, j = 0; i <= m; 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 <= n; i ++ )

{

while (j && s[i] != p[j + 1]) j = ne[j];

if (s[i] == p[j + 1]) j ++ ;

if (j == m)

{

j = ne[j];

// 匹配成功后的逻辑

}

}

8.Trie树

int son[N][26], cnt[N], idx;

// 0号点既是根节点,又是空节点

// son[][]存储树中每个节点的子节点

// cnt[]存储以每个节点结尾的单词数量

// 插入一个字符串

void insert(char *str)

{

int p = 0;

for (int i = 0; str[i]; i &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值