传说魔镜可以把任何接触镜面的东西变成原来的两倍,不过增加的那部分是反的。例如,对于字符串xy,若把y端接触镜面,则魔镜会把这个字符串变为xyyx;若再用x端接触镜面,则会变成xyyxxyyx。对于一个最终得到的字符串(可能未接触魔镜),请输出没使用魔镜之前,该字符串最初可能的最小长度。
时间: 2023-04-27 20:03:35 浏览: 225
假设最终得到的字符串为s,那么s的长度一定是偶数,因为魔镜每次都会将字符串长度翻倍。
我们可以从s的中间位置开始,向两边扩展,每次判断左右两边的子串是否相等。如果相等,说明这个子串是由镜面反射得到的,可以将其缩小一半,继续向两边扩展。如果不相等,说明这个子串不是由镜面反射得到的,需要将中间位置向左或向右移动一位,继续扩展。
最终得到的最小长度就是扩展的次数加上1(因为最开始的中间位置也算一个扩展)。
相关问题
用python写以下题目的代码,传说魔镜可以把任何接触镜面的东西变成原来的两倍,不过增加的那部分是反的。例如,对于字符串XY,若把Y端接触镜面,则魔镜会把这个字符串变为XYYX;若再用X端接触镜面,则会变成XYYXXYYX。对于一个最终得到的字符串(可能未接触魔镜),请输出没使用魔镜之前,该字符串最初可能的最小长度。 输入格式: 测试数据有多组,处理到文件尾。每组测试输入一个字符串(长度小于100,且由大写英文字母构成)。 输出格式: 对于每组测试数据,在一行上输出一个整数,表示没使用魔镜前,最初字符串可能的最小长度。 输入样例: XYYXXYYX XYXX 输出样例: 2 4
```python
while True:
try:
s = input().strip()
n = len(s)
res = n
for i in range(n):
# 以i为轴,向两边扩展,找到最短的原始字符串
j = 1
while i - j >= 0 and i + j < n and s[i-j:i+j+1] == s[i-j:i+j+1][::-1]:
j += 1
if i - j < 0 and i + j >= n: # 已经找到原始字符串
res = min(res, n + i + 1)
break
if i - j < 0: # 原始字符串在左边
res = min(res, n + i - j + 1)
else: # 原始字符串在右边
res = min(res, n + i - j)
print(res)
except:
break
```
思路:
题目要求求出最小长度的原始字符串,可以考虑从每个字符开始向两边扩展,找到最短的原始字符串的长度,然后取最小值即可。因为魔镜的作用,可以把字符串分为两部分,一部分是原始字符串,另一部分是反转的增量部分。因此,我们可以枚举每个字符,以该字符为轴,向两边扩展,找到最短的原始字符串的长度。具体实现时,可以维护一个变量 $res$,表示目前找到的最小长度,每次扩展时,更新 $res$ 即可。注意,为了方便处理,可以把原始字符串看成在字符串的右边,这样就不用特判左边和右边的情况了。
用python3编程解题国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。 比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。 给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。 输入 第一行是一个整数N(N<=10)表示测试数据的组数) 每组测试数据占一行 只有一个字符串(长度小于100),由大写英文字母组成,表示最终的项链。 输出 每组测试数据的输出只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。
这道题可以使用“双倍经验”的思想,对于给定的项链,我们从最后一位开始遍历,如果这一位是反向的,则我们需要把这一位的前一位也加入到结果中,因为这一位实际上是和前一位重合的。如果这一位是正向的,则我们只需要加入这一位。
最后,我们得到的结果需要除以2,因为我们遍历了整个项链,而实际上我们只需要遍历一半,所以最终的长度是原长度的一半。
下面是Python代码实现:
```python
def find_min_len(chain):
n = len(chain)
for i in range(n - 1, -1, -1):
if chain[i] == chain[0]:
if chain[:n-i] == chain[i:]:
return n - i
return n
t = int(input())
for i in range(t):
chain = input().strip()
print(find_min_len(chain) // 2)
```
这里我们定义了一个`find_min_len`函数来计算最小长度,然后在主程序中读取输入,分别计算每组数据的答案并输出。
阅读全文