Bootstrap

CF292C Beautiful IP Addresses 题解

题目介绍

这道题我们读完题后看到题目给的条件:

IP 地址,且去掉分割的点以后的纯数字字符串是回文,那么就叫做美丽的 IP。

暴力方法

是不是听起来很简单,我先介绍一个大多数人都能想到的部分分做法:

枚举出所有 IP 的纯数字字符串,然后判断回文。

是回文那就考虑点的位置。

就是那么简单,但是我们来算一算最坏会运行多少次。

首先,我们要知道,IPv4 地址的每一位都是 0 0 0 ~ 255 255 255

那么一共就是 26 6 4 266^4 2664 种,通过计算器我们得知这个大小大概是 5 × 1 0 9 5 \times 10^9 5×109

很明显,这种算法是无法通过的,那我们就要加以优化。

优化

我们想一下:既然我们都要判断回文了,为什么我们不直接构造一个回文呢?

那你可能要问了:“你说得那么简单,那怎么构造回文?而且,就算构造了,你怎么证明你这个算法就是对的?”

如何构造回文?

我们先一起想一想我们是怎么用双指针判断回文的。

是不是像这样一个指头一个指尾,然后同时向中间走?

那我们可不可以反过来,先填充绿色箭头,再填充浅灰色、深灰色、黑色?

最后我们把构造的回文存在一个 vector 变量里面,等会去分割点不就行了么?

哦对了,对于 IP 产生的纯数字字符串长度是 8 8 8 ~ 12 12 12。我的做法会去判断奇偶,如果是奇数就先特殊地添加一位(绿色箭头),偶数则不用。

如何添加分割点?

我们在这里先写一个判断(check)来判断这个串是否是合法,判断的方法其实就只是把这个纯数字串转成数字,进行判断是否 ⩾ 0 \geqslant 0 0 以及 ⩽ 255 \leqslant 255 255,方便我们后面进行分割。

我们想一想,我们已经求出了原数字串,已经规定了一共三个点。

那么我们为什么不可以切割出四个数字串,然后用三个点连接起来呢?

思路就是这样,模拟即可。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;