首页 > 其他分享 >灵茶之KMP01

灵茶之KMP01

时间:2024-03-30 16:46:01浏览次数:19  
标签:pmt cnt 灵茶 KMP01 ans 字符串

灵茶之KMP01

题目链接

https://codeforces.com/problemset/problem/1137/B

题目大意

输入两个长度均 ≤\(5* 10^5\) 的字符串 s 和字符串 t,只包含 '0' 和 '1'。 重排 s 中的字符,使得 s 中有尽量多的子串等于 t。 输出重排后的 s。 如果有多个答案,输出任意一个。

思路

贪心的思路,每次添加都按照PMT数组中的逻辑添加

题目代码

from collections import Counter
s = input()
cnt = Counter(s)
t = input()
m = len(t)
pmt = [0] * m
c = 0
for i in range(1,m):
    x = t[i]
    while c and t[c] != x:
        c = pmt[c - 1]
    if t[c] == x:
        c += 1
    pmt[i] = c

ans = []
c = 0
for _ in range(len(s)):
    if cnt[t[c]] == 0:
        break
    ans.append(t[c])
    cnt[t[c]] -= 1
    c += 1
    if c == m:
        c = pmt[c - 1]

ans = ''.join(ans) + cnt['0'] * '0' + cnt['1'] * '1'

print(ans)

重大发现

Python的字符串加减次数太多会减慢效率,当要多次添加元素时,尽量先转换成数组,最后再转换成字符串!

标签:pmt,cnt,灵茶,KMP01,ans,字符串
From: https://www.cnblogs.com/gebeng/p/18105694

相关文章

  • 灵茶之二分01
    灵茶之二分01链接Problem-166C-Codeforces题目大意输入n(1≤n≤500)x(1≤x≤\(10^5\))和长为n的数组a(1≤a[i]≤\(10^5\))。向a中添加尽量少的数,使得a的中位数恰好等于x。输出添加的元素个数。注:如果n是偶数,中位数取正中间左边那个。例如a=[1,3,5,7]的......
  • 灵茶之贪心模拟01
    灵茶之贪心模拟01题目链接https://codeforces.com/problemset/problem/1443/B题目大意输入T(≤\(10^5\))表示T组数据。所有数据的字符串长度之和≤\(10^5\)。每组数据输入a(1≤a≤1000)b(1≤b≤1000)和长度不超过\(10^5\)的01字符串。你可以花费a,把一段连续的......