1996.打乱字母

1996.打乱字母,第1张

1996.打乱字母

Powered by:NEFU AB-IN

link

文章目录

1996.打乱字母

题意思路代码

1996.打乱字母

题意

农夫约翰将按字典序排列的 N 头奶牛的名字列表贴在了牛棚的门上。
每个奶牛的名字都由一个长度介于 1 到 20 之间的由小写字母构成的唯一字符串表示。
麻烦制造者贝茜将列表中的奶牛名字重新排序打乱了列表。
此外,她还对每头奶牛的名字中的字母顺序进行了重新排列(也可能保持不变)。
给定修改过后的列表,请帮助约翰确定列表中的每个名字可能出现在原始列表中的最低和最高位置。

思路

本题考虑用贪心,每个字符串出现的最大位置是当其他字符串字典序均最小的时候,反之亦然。

我们可以先开一个列表 l s t lst lst,用来存储所有字符串字典序最小的值,不排序

再开两个列表 l s t _ u p lst_up lst_up, l s t _ d o w n lst_down lst_down,分别存储所有字符串字典序最小和字典序最大的值,并升序排序。

在查找时,我们只需要查找每个字符串 s s s的最小字典序在 l s t _ d o w n lst_down lst_down中的位置即可得到可能出现的最小位置,反之亦然。

这里就需要用到二分

介绍 P y t h o n Python Python的库—— b i s e c t bisect bisect

bisect_left(lst_down, s), 对应lower_boundbisect_right(lst_up, s[::-1]), 对应upper_bound 代码

'''
Author: NEFU AB-IN
Date: 2022-01-09 09:51:53
FilePath: ACMAcwing1996.py
LastEditTime: 2022-01-09 11:43:36
'''
import bisect


def solve():
    n = int(input())
    lst = []
    lst_up = []
    lst_down = []
    for _ in range(n):
        s = sorted(input())
        lst.append(s)
        lst_up.append(s)
        lst_down.append(s[::-1])

    lst_up.sort()
    lst_down.sort()

    for s in lst:
        #lower_bound
        low = bisect.bisect_left(lst_down, s) + 1
        #upper_bound
        high = bisect.bisect_right(lst_up, s[::-1])
        print(low, high)


if __name__ == "__main__":
    solve()

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5701113.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存