输出结果和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)