预备役间学习记录9

一、学习算法

1、字符串

(1)kmp(字符串比配)
  1. 主要运用到(第0位-1)从第二位开始对每位的前字符串求最大前缀和后缀的相同子串长度;

方法:

列如:主串:a b a a c a b a b c a c

子串:a b a b c

next : -1 0 0 1 2

下标 值 串

0 0 空

1 0 a b

2 1 a b a

3 2 a b a b

4 0 a b a b c

next[i]的值为:0--i构成的字符串中出现首尾相同的字串的最大长度;

当无首尾相同的子串时next[i]的值为0;

  1. 在主串i++和子串j++比较过程中当不一样时,j=next[j];

就像这种第一次不同时i=3,j=3,执行后j=2;

i

a b a a c a b a b c a c

a b a b c

j

往后执行第二次不同i=4,j=3,不同j=next[j],j=2;

i

a b a a c a b a b c a c

a b a b c

j

往后执行第三次不同i=4,j=2,不同j=next[j],j=1;

i

a b a a c a b a b c a c

a b a b c

j

往后执行第四次不同i=4,j=1,不同j=next[j],j=0

i

a b a a c a b a b c a c

a b a b c

j

往后执行第五次不同i=4,j=0,此时注意是在j=0情况下不同,就这样执行i++,j=0;

i

a b a a c a b a b c a c

a b a b c

j

往后执行子串结束,代表比配成功,有这个子串结束循环;

附代码(next数组求法;kmp匹配方法)

二、刷题题解

1、# 修复公路

## 题目背景

$A$地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。

## 题目描述

给出A地区的村庄数$N$,和公路数$M$,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)

## 输入格式

第$1$行两个正整数$N,M$

下面$M$行,每行$3$个正整数$x, y, t$,告诉你这条公路连着$x,y$两个村庄,在时间t时能修复完成这条公路。

## 输出格式

如果全部公路修复完毕仍然存在两个村庄无法通车,则输出$-1$,否则输出最早什么时候任意两个村庄能够通车。

## 样例 #1

### 样例输入 #1

```

4 4

1 2 6

1 3 4

1 4 5

4 2 3

```

### 样例输出 #1

```

5

```

## 提示

$N \le 1000,M \le 100000$

$x \le N,y \le N,t \le 100000$

  1. 并查集,我们定义一个结构体数组来存村庄关系,和之间的时间,定义一个数组记录集合;

  1. 按时间从小到大对结构体数组排序;

  1. 之后,对结构体从i=1;i<=n;i++开始检索,并进行并查,到查到所有村庄都到一个集合时,此时检索到的关系时间就是最短时间,如果i>n还没到一个集合则输出-1

附代码

2、# 【深基16.例3】二叉树深度

## 题目描述

有一个 $n(n \le 10^6)$ 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 $n$),建立一棵二叉树(根节点的编号为 $1$),如果是叶子结点,则输入 `0 0`。

建好这棵二叉树之后,请求出它的深度。二叉树的**深度**是指从根节点到叶子结点时,最多经过了几层。

## 输入格式

第一行一个整数 $n$,表示结点数。

之后 $n$ 行,第 $i$ 行两个整数 $l$、$r$,分别表示结点 $i$ 的左右子结点编号。若 $l=0$ 则表示无左子结点,$r=0$ 同理。

## 输出格式

一个整数,表示最大结点深度。

## 样例 #1

### 样例输入 #1

```

7

2 7

3 6

4 5

0 0

0 0

0 0

0 0

```

### 样例输出 #1

```

4

```

  1. 这题考二叉树的遍历计算深度,我们只需定义一个结构体数组来记录每个节点的两个子节点;

  1. 然后进行DFS递归,传(1,1)上去代表从第一个节点的左右节点开始;

  1. 递归前判断是否到叶子节点0 0,是就直接return;没有到就记深度的变量++,然后先左节点dfs(传左节点的值,层数+1),在右节点dfs();

附代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值