第一行两个整数
代表字符串长度和操作次数。
第二行一个长度为
的字符串
。
第三行一个长度为
的字符串
。
此后
行,每行一个整数
,表示每次交换的位置。
对于每一次询问,在一行上输出一个整数,表示交换后字符串
中的
子序列和
中
的子序列之差。
5 2 redar adade 5 4
1 2
from bisect import *
def func(lst):
if "r" not in lst&nbs***bsp;"e" not in lst&nbs***bsp;"d" not in lst:
return 0
d1 = {"r":[],"e":[],"d":[]}
for i,v in enumerate(lst):
if v in d1:
d1[v].append(i)
res = 0
for r in d1["r"]:
m = bisect(d1["e"],r)
if len(d1["e"])-m:
for e in d1["e"][m:]:
d = len(d1["d"]) - bisect(d1["d"],e)
res += d
return res
n,q = map(int,input().split())
s = list(input())
t = list(input())
for _ in range(q):
x = int(input()) - 1
s[x],t[x] = t[x],s[x]
print(func(s) - func(t)) 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])
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 20e5;
class Redstring {
private:
struct Node {
ll l, r;
ll rcnt, ecnt, dcnt, recnt, edcnt, redcnt;
};
Node tr[N];
void pushup(ll u) {
tr[u].rcnt = tr[u << 1].rcnt + tr[u << 1 | 1].rcnt;
tr[u].ecnt = tr[u << 1].ecnt + tr[u << 1 | 1].ecnt;
tr[u].dcnt = tr[u << 1].dcnt + tr[u << 1 | 1].dcnt;
tr[u].recnt = tr[u << 1].recnt + tr[u << 1 | 1].recnt + tr[u << 1].rcnt * tr[u
<< 1 | 1].ecnt;
tr[u].edcnt = tr[u << 1].edcnt + tr[u << 1 | 1].edcnt + tr[u << 1].ecnt * tr[u
<< 1 | 1].dcnt;
tr[u].redcnt = tr[u << 1].redcnt + tr[u << 1 | 1].redcnt + tr[u << 1].rcnt *
tr[u << 1 | 1].edcnt + tr[u << 1].recnt * tr[u << 1 | 1].dcnt;
}
public:
void build(ll u, ll l, ll r, const string& s) {
tr[u].l = l;
tr[u].r = r;
if (l == r) {
tr[u].rcnt = tr[u].ecnt = tr[u].dcnt = 0;
tr[u].recnt = tr[u].edcnt = tr[u].redcnt = 0;
if (s[l] == 'r') tr[u].rcnt = 1;
else if (s[l] == 'e') tr[u].ecnt = 1;
else if (s[l] == 'd') tr[u].dcnt = 1;
} else {
ll mid = (l + r) >> 1;
build(u << 1, l, mid, s);
build(u << 1 | 1, mid + 1, r, s);
pushup(u);
}
}
void modify(ll u, ll x, char v) {
if (tr[u].l == tr[u].r) {
tr[u].rcnt = tr[u].ecnt = tr[u].dcnt = 0;
tr[u].recnt = tr[u].edcnt = tr[u].redcnt = 0;
if (v == 'r') tr[u].rcnt = 1;
else if (v == 'e') tr[u].ecnt = 1;
else if (v == 'd') tr[u].dcnt = 1;
} else {
ll mid = (tr[u].l + tr[u].r) >> 1;
if (x <= mid) modify(u << 1, x, v);
else modify(u << 1 | 1, x, v);
pushup(u);
}
}
ll get_redcnt(int u) {
return tr[u].redcnt;
}
};
int main() {
ll n, q, pos;
string s, t;
cin >> n >> q;
cin >> s >> t;
s = " " + s; // 1-based
t = " " + t; // 1-based
Redstring s1, t1;
s1.build(1, 1, n, s);
t1.build(1, 1, n, t);
while (q--) {
cin >> pos;
swap(s[pos], t[pos]);
s1.modify(1, pos, s[pos]);
t1.modify(1, pos, t[pos]);
cout << s1.get_redcnt(1) - t1.get_redcnt(1) << endl;
}
return 0;
} import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int q = in.nextInt();
char[]s1 = in.next().toCharArray();
char[]s2 = in.next().toCharArray();
SegTree t1=SegTree.build(s1,0,n-1);
SegTree t2=SegTree.build(s2,0,n-1);
for (int i = 0; i < q; i++) {
int x = in.nextInt();
char c=s1[x-1];
s1[x-1]=s2[x-1];
s2[x-1]=c;
t1.update(x-1,s1[x-1]);
t2.update(x-1,s2[x-1]);
System.out.println(t1.redcnt-t2.redcnt);
}
}
}
class SegTree{
int l;
int r;
int rcnt;//r
int ecnt;//e
int dcnt;//d
long recnt;//re
long edcnt;//ed
long redcnt;//red
SegTree left;
SegTree right;
public void update(int k,char c){
if(k<l||k>r)
return;
if(l==r&&l==k){
rcnt=c=='r'?1:0;
ecnt=c=='e'?1:0;
dcnt=c=='d'?1:0;
return;
}
int mid=(l+r)/2;
if(k<=mid){
left.update(k,c);
}else{
right.update(k,c);
}
mergeSub();
}
public void mergeSub(){
rcnt=left.rcnt+right.rcnt;
ecnt=left.ecnt+right.ecnt;
dcnt=left.dcnt+right.dcnt;
recnt=left.recnt+right.recnt+left.rcnt*right.ecnt;
edcnt=left.edcnt+right.edcnt+left.ecnt*right.dcnt;
redcnt=left.redcnt+right.redcnt+left.rcnt*right.edcnt+left.recnt*right.dcnt;
}
public static SegTree build(char[]s,int l,int r)
{
SegTree t=new SegTree();
t.l=l;
t.r=r;
if(l==r)
{
t.rcnt=s[l]=='r'?1:0;
t.ecnt=s[l]=='e'?1:0;
t.dcnt=s[l]=='d'?1:0;
t.recnt=t.edcnt=t.redcnt=0;
return t;
}
int mid=(l+r)/2;
t.left=build(s,l,mid);
t.right=build(s,mid+1,r);
t.mergeSub();
return t;
}
} n,q=map(int, input().split())
s=list(input())
t=list(input())
def findred(listf):
res=0
for i in range(1,len(listf)-1):
if listf[i]=='e':
res+=listf[:i].count('r')*listf[i:].count('d')
return res
for i in range(q):
c=int(input())-1
s[c],t[c]=t[c],s[c]
print(findred(s)-findred(t)) 9敏,超时了,家人们谁懂啊,一整个无语住了,我真的会谢(
m,n=list(map(int,input().split()))
s1=input()
s2=input()
l=[]
for i in range(n):
l.append(int(input()))
def countRed(s):
if not ("r" in s and "e" in s and "d" in s):
return 0
r,e,d=[],[],[]
sum=0
for i in range(len(s)):
if s[i]=="r":
r.append(i)
continue
if s[i]=="e":
e.append(i)
continue
if s[i]=="d":
d.append(i)
tmpe=0
for i in range(len(r)):
tmpd=0
for j in range(tmpe,len(e)):
if r[i]>e[j]:
tmpe=j
continue
for k in range(tmpd,len(d)):
if e[j]<d[k]:
sum+=len(d)-k
tmpd=k
break
return sum
for i in l:
tmp1,tmp2=list(s1),list(s2)
tmp1[i-1],tmp2[i-1]=tmp2[i-1],tmp1[i-1]
tmps1="".join(tmp1)
tmps2="".join(tmp2)
print(countRed(tmps1)-countRed(tmps2)) 运行超时,结果也不对哈哈
line = input().split(" ")
length = int(line[0])
num = int(line[1])
line1 = input()
line2 = input()
def get_dp(line):
length = len(line)
dp_r = [0] * length # 当前下标前方有多少个r
dp_d = [0] * length # 当前下标后方有多少个d
dp_e = [] # 所有 e 的下标
for i in range(length - 1):
if line[i] == "r":
dp_r[i + 1] = dp_r[i] + 1
else:
dp_r[i + 1] = dp_r[i]
for i in range(length):
if line[i] == "e":
dp_e.append(i)
for i in range(length - 1, 0, -1):
if line[i] == "d":
dp_d[i - 1] = dp_d[i] + 1
else:
dp_d[i - 1] = dp_d[i]
return dp_r, dp_e, dp_d
def get_red_num(dp_r, dp_e, dp_d):
# print(dp_r, dp_e, dp_d)
res = 0
for index in dp_e:
res += dp_r[index] * dp_d[index]
return res
dp1_r, dp1_e, dp1_d = get_dp(line1)
dp2_r, dp2_e, dp2_d = get_dp(line2)
while 1:
# dp1_r_temp = list(dp1_r)
# dp1_e_temp = list(dp1_e)
# dp1_d_temp = list(dp1_d)
# dp2_r_temp = list(dp2_r)
# dp2_e_temp = list(dp2_e)
# dp2_d_temp = list(dp2_d)
dp1_r_temp = dp1_r
dp1_e_temp = dp1_e
dp1_d_temp = dp1_d
dp2_r_temp = dp2_r
dp2_e_temp = dp2_e
dp2_d_temp = dp2_d
try:
chage_index = int(input()) - 1
cha1 = line1[chage_index]
cha2 = line2[chage_index]
if cha1 == "r" and cha2 != "r":
for i in range(chage_index + 1, length):
dp1_r_temp[i] -= 1
dp2_r_temp[i] += 1
if cha1 == "e" and cha2 != "e":
dp1_e_temp.remove(chage_index)
dp2_e_temp.append(chage_index)
if cha1 == "d" and cha2 != "d":
for i in range(0, chage_index):
dp1_d_temp[i] -= 1
dp2_d_temp[i] += 1
if cha2 == "r" and cha1 != "r":
for i in range(chage_index + 1, length):
dp2_r_temp[i] -= 1
dp1_r_temp[i] += 1
if cha2 == "e" and cha1 != "e":
dp2_e_temp.remove(chage_index)
dp1_e_temp.append(chage_index)
if cha2 == "d" and cha1 != "d":
for i in range(0, chage_index):
dp2_d_temp[i] -= 1
dp1_d_temp[i] += 1
print(get_red_num(dp1_r_temp, dp1_e_temp, dp1_d_temp) - get_red_num(dp2_r_temp, dp2_e_temp, dp2_d_temp))
except Exception as e:
# print(e)
break