CF1697C
Solution:
题目翻译的很清楚了,不多赘述。
题目要求只能变换 \(s\) 串,刚开始没看见,建议仔细读题。
考虑两种变化,\(ab\) 变为 \(ba\) 和 \(bc\) 变为 \(cb\),观察到没有 \(a\) 和 \(c\) 之间的变化,所以 \(a\) 和 \(c\) 的相对位置一定不会发生改变。换句话说,无视掉两串中的 \(b\),剩余部分是完全一样的,还有值得注意的是,这两种变换,只能让 \(a\) 向后移动或不动,让 \(c\) 向前移动或不动,所以对应 \(a\) 出现时只能在 \(s\) 串的位置在先或相同,\(c\) 同理。用双指针模拟操作,注意判断三种情况即可。
Code:
signed main(){
Q=read();
while(Q--){
int len=read();
cin>>s1>>s2;
int cnt1=0,cnt2=0;
for(int i=0;i<len;i++){
if(s1[i]=='b') cnt1++;
if(s2[i]=='b') cnt2++;
}
if(cnt1!=cnt2) puts("NO");
else{
int j=0,f=0;
for(int i=0;i<len;i++){
if(s1[i]=='b') continue;
while(s2[j]=='b') j++;
if((s1[i]!=s2[j])||(s1[i]=='a'&&i>j)||(s1[i]=='c'&&i<j)){f=1;puts("NO");break;}
j++;
}
if(!f) puts("YES");
}
}
return 0;
}