Codeforce Round #506 Div3
A Many Euqal Substrings
题意:就是求字符串的最长前缀后缀匹配子串
题解:利用KMP算法求next数组,nxet[len[t]]可能就是最长前缀后缀匹配长度,再做下判断就好了
时间复杂度O(n), n 为字符串的长度
# -*- coding: utf-8 -*- def get_next(t, nxt): t = ' ' + t i = 1 j = 0 nxt[1] = 0 m = len(t) - 1 while i < m: if j == 0 or t[i] == t[j]: i += 1 j += 1 nxt[i] = j else: j = nxt[j] return nxt[m] n, k = map(int, input().split()) t = str(input()) nxt = [0] * (len(t) + 1) length = get_next(t, nxt) if t[length - 1] != t[-1]: if t[0] == t[-1]: length = 1 else: length = 0 print(t[0:n - length] * k + t[n - length:n])
B Creating the Contest
B题比A题要简单些,贪心一下就好了
def work(n, a): tmp = 1 maxV = 1 for i in range(1, n): if a[i] <= a[i - 1] * 2: tmp += 1 else: maxV = max(maxV, tmp) tmp = 1 return max(maxV, tmp) n = int(input()) a = tuple(map(int, input().split())) print(work(n, a))
C Maximal Intersection
我做这道题比做A题用的时间短些,这道题就是排序,完了之后
__答案就是:__max(r[0] - l[-2], r[1] - l[-1]),若(l[-1], r[0])是一个片段,再更新一下期望的结果
def work(n, a, b): a_ = a[:] b_ = b[:] a.sort() b.sort() ans = max(b[0] - a[-2], b[1] - a[-1]) for i in range(n): if a[-1] == a_[i] and b[0] == b_[i]: ans = max(b[1] - a[-2], ans) break return ans if ans >= 0 else 0 n = int(input()) a = [] b = [] for i in range(n): l, r = map(int, input().split()) a.append(l) b.append(r) print(work(n, a, b))
D Concatenated Multiples
选择pypy提交时,比选择python快多了
def: main(): # PyPy is fast, compliant n, k = map(int, input().split()) aa, cnt, res = [], {}, 0 scale = [10 ** i + 1 for i in range(11)] for w in input().split(): a, s = int(w), len(w) aa.append(a) if not a * scale[s] % k: res -= 1 t = (s, a % k) cnt[t] = cnt.get(t, 0) + 1 scale = [1 - i for i in scale] for a in aa: for s in range(1, 11): x = a * scale[s] % k res += cnt.get((s, x), 0) print(res) if __name__ == '__main__': main()
python学习总结
做这几道题练手python,遇到的几个问题
- 数组复制用[:], 直接用 = 是传引用,函数参数传递类似于java
- 三目运算符不同于C语言,真值 if 成立 else 假值
- input一次读一行,tuple数组,list列表,dict字典。map()返回值类型是list
- python无自增自减运算符,因为自增自减改变对象本身,学习C++重载自增自减运算符时可以理解这一点。+= 改变了变量。python模型规定数值对象是不可改变的。