第一行两个整数
代表字符串长度和操作次数。
第二行一个长度为
的字符串
。
第三行一个长度为
的字符串
。
此后
行,每行一个整数
,表示每次交换的位置。
对于每一次询问,在一行上输出一个整数,表示交换后字符串
中的
子序列和
中
的子序列之差。
5 2 redar adade 5 4
1 2
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;
}
}