Educational Codeforces Round 130 C awoo‘s Favorite Problem(详细)

写了一个小时才写过,记一下这个题,思维性有点强。

大意

给一个字符串s,只有a,b,c三个字母,两种操作
1.把 ab 换成 ba
2.把 bc 换成 cb

问是否能变成字符串 t

思路

首先给出操作的两个特点
1.a向后移动,c向前移动。
2.无论如何移动,a与c,a,c自身不会产生交错,即a,c的相对位置不会发生改变

利用特点二,我们可以知道,s如果能变换到t,两个串去掉 b 之后应该完全相同,因为相对位置不变。

利用特点一,我们可以知道,s如果能变换到t,t串的a的下标肯定 > = >= >= s串的a的下标,t串的c的下标肯定 < = <= <= s串的c的下标;

利用这两个规律我们就可以写出代码

代码

#include<bits/stdc++.h>
using namespace std;

int t;
int n;
string s1,s2;

bool solve()
{
	vector<int>ve1a;
	vector<int>ve1c;
	vector<int>ve2a;
	vector<int>ve2c;
	
	for(int i=0;i<n;i++)
	{
		if(s1[i]=='a') ve1a.push_back(i);
		if(s1[i]=='c') ve1c.push_back(i);
		if(s2[i]=='a') ve2a.push_back(i);
		if(s2[i]=='c') ve2c.push_back(i);
	}
	
	for(int i=0;i<ve1a.size();i++)
	{
		if(ve1a[i]>ve2a[i]) return 0;
	}
	for(int i=0;i<ve1c.size();i++)
	{
		if(ve1c[i]<ve2c[i]) return 0;
	}
	
	return 1;
	
}

int main()
{
	cin>>t;
	
	while(t--)
	{
		scanf("%d",&n);
		cin>>s1>>s2;
		
		string a1="",a2="";
		
		for(int i=0;i<n;i++)
		{
			if(s1[i]!='b') a1+=s1[i];
			if(s2[i]!='b') a2+=s2[i];
		}
		
		if(a1!=a2)
		{
			puts("NO");
			continue;
		}
		
		if(solve()) puts("YES");
		else puts("NO");
		
	}
}

反思

只利用特点一肯定是行不通的,举两组例子

ac
ca

acb
cab

第一组满足相对位置,但是没有b根本无法交换
第二组虽然有b,但是b无法支持交换

所以特点二是必不可少的,只有满足特点二s才有可能变换到t

以后做题前要多举反例,多总结变换特点

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里再与你相见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值