输出结果和C++版一致,但是提交不通过,怀疑是系统问题。
class Node(object): # 线段树的结点类
def __init__(self):
self.ln = -1
self.rn = -1 # 左子节点和右子节点,值为字符的索引
self.r = 0 # 分别记录 r, e, d, re, ed, red 的个数
self.e = 0
self.d = 0
self.re = 0
self.ed = 0
self.red = 0
class SegTree(object): # 线段树类
def __init__(self, data):
self.n = len(data)
# 初始化线段树,大小为4*n(因为最坏情况下是满二叉树)
self.tree = [Node() for _ in range(self.n * 4)]
self.build(data, 1, 0, self.n - 1) # 树节点从1开始
def build(self, data, node, start, end): # 构建线段树
# data 表示字符串, node 表示节点下标,start 和 end 表示 字符的索引
self.tree[node].ln = start
self.tree[node].rn = end
if start == end: # 如果当前节点是叶子节点
self.tree[node].r = int(data[start] == 'r')
self.tree[node].e = int(data[start] == 'e')
self.tree[node].d = int(data[start] == 'd')
return
mid = (start + end) // 2
self.build(data, node * 2, start, mid) # 左子树
self.build(data, node * 2 + 1, mid + 1, end) # 右子树
self.push_up(node)
def push_up(self, node): # 计算该节点的r e d re ed red 个数
left = self.tree[node * 2] # 左节点
right = self.tree[node * 2 + 1] # 右节点
self.tree[node].r = left.r + right.r
self.tree[node].e = left.e + right.e
self.tree[node].d = left.d + right.d
self.tree[node].re = left.re + right.re + left.r * right.e
self.tree[node].ed = left.ed + right.ed + left.e * right.d
self.tree[node].red = left.red + right.red + left.re * right.d + left.r * right.ed
def update(self, node, pos, val): # 单点更新,pos表示更新的索引,val表示更新的值
if self.tree[node].ln == self.tree[node].rn and self.tree[node].ln == pos: # 递归到叶子节点
self.tree[node].r = int(val == 'r')
self.tree[node].e = int(val == 'e')
self.tree[node].d = int(val == 'd')
return
mid = (self.tree[node].ln + self.tree[node].rn) // 2
if pos <= mid:
self.update(node * 2, pos, val)
else:
self.update(node * 2 + 1, pos, val)
self.push_up(node)
n, q = map(int, input().split())
s = input()
t = input()
seg_s = SegTree(s)
seg_t = SegTree(t)
opt = []
for _ in range(q):
x = int(input()) - 1
opt.append(x)
for x in opt:
seg_s.update(1, x, t[x])
seg_t.update(1, x, s[x])
s, t = s[:x] + t[x] + s[x + 1:], t[:x] + s[x] + t[x + 1:]
print(seg_s.tree[1].red - seg_t.tree[1].red)

京公网安备 11010502036488号