第一行两个整数
代表字符串长度和操作次数。
第二行一个长度为
的字符串
。
第三行一个长度为
的字符串
。
此后
行,每行一个整数
,表示每次交换的位置。
对于每一次询问,在一行上输出一个整数,表示交换后字符串
中的
子序列和
中
的子序列之差。
5 2 redar adade 5 4
1 2
import sys
def cal_red(word: str):
nr = 0
nre = 0
nred = 0
for l in word:
if l == 'r':
nr += 1
elif l == 'e':
nre += nr
elif l == 'd':
nred += nre
return nred
n, q = input().split(' ')
n, q = int(n), int(q)
s = input()
t = input()
n_s, n_t = 0, 0
for _ in range(q):
x = int(input())
tmpt, tmps = t[x-1], s[x-1]
s = s[:x-1] + tmpt + s[x:]
t = t[:x-1] + tmps + t[x:]
if tmpt in 'red'&nbs***bsp;tmps in 'red'&nbs***bsp;_ == 0:
n_s = cal_red(s)
n_t = cal_red(t)
print(n_s - n_t)
import sys import re n,q=map(int,input().split()) s=list(input()) t=list(input()) class SegmentTree: def __init__(self,s): # self.n=len(s) N=1 while N<self.n: N<<=1 #叶子节点的位置 self.N=N size=2*N self.r=[0]*size self.e=[0]*size self.d=[0]*size self.re=[0]*size self.ed=[0]*size self.red=[0]*size #叶子节点赋值 for i in range(self.n): if s[i]=='r': self.r[N+i]=1 elif s[i]=='e': self.e[N+i]=1 elif s[i]=='d': self.d[N+i]=1 for i in range(N-1,0,-1): self.merge(i) #把Id节点的左右节点合并到自身 def merge(self,id): l=id*2 r=id*2+1 self.r[id]=self.r[l]+self.r[r] self.e[id]=self.e[l]+self.e[r] self.d[id]=self.d[l]+self.d[r] self.re[id]=self.re[l]+self.re[r]+self.r[l]*self.e[r] self.ed[id]=self.ed[l]+self.ed[r]+self.e[l]*self.d[r] self.red[id]=self.red[l]+self.red[r]+self.r[l]*self.ed[r]+self.re[l]*self.d[r] #修改节点 def update(self,pos,ch): N=self.N self.r[pos+N]=0 self.e[pos+N]=0 self.d[pos+N]=0 if ch=='r': self.r[pos+N]=1 elif ch=='e': self.e[pos+N]=1 elif ch=='d': self.d[pos+N]=1 x=(pos+N)//2 while x>=1: self.merge(x) x//=2 segtree1=SegmentTree(s) segtree2=SegmentTree(t) for _ in range(q): pos=int(input())-1 t[pos],s[pos]=s[pos],t[pos] segtree1.update(pos,s[pos]) segtree2.update(pos,t[pos]) print(segtree1.red[1]-segtree2.red[1])