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;
}
posted @ 2022-06-19 18:06  Gym_nastics  阅读(36)  评论(0编辑  收藏  举报