关于交换排序的一点技巧

Educational Codeforces Round 130 Editorial - Codeforces

C

首先,b只能和c互换,a只能和b互换,那么容易想到(其实也没那么容易QWQ)a和c的相对位置再任意数量操作后都会保持不变,即去掉所有b后a和c的排列是一样的

那么可以首先对 s 和 t 删除所有 b 并存储剩下的序列 A 和 B  ,看看是否一致;

其次还要判断 ,A中的a再原来s序列中的下标是否小于等于B中的a再原来t中的下标,因为a只能向右移动,同理b也要有类似判断,只是条件为大于等于

int main()
{
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
#endif
	IO;
	int t; cin >> t;
	while (t--)
	{
		int n; cin >> n;
		string s, t;
		cin >> s >> t;
		int ns[3]={0}, nt[3]={0};
		rep(i, 0, n - 1)ns[s[i] - 'a']++, nt[t[i] - 'a']++;
		bool f = true;
		rep(i, 0, 2)if (ns[i] != nt[i]) { f = false; break; }
		if (!f)cout << "NO\n";
		else
		{
			string k;
			string kk;
			vector<int> id;
			rep(i, 0, n - 1)
			{
				if (t[i] != 'b')k += t[i], id.push_back(i);
				if (s[i] != 'b')kk += s[i];
			}
			if (kk != k)
			{
				cout << "NO\n";
				continue;
			}
			int tot = 0;
			bool ff = true;
			rep(i, 0, n - 1)
			{
				if (s[i] == 'b')continue;
				if (s[i] == 'a' && i <= id[tot++])
					continue;
				else if (s[i] == 'c' && i >= id[tot++])
					continue;
				else
				{
					cout << "NO\n";
					ff = false;
					break;
				}
			}
			if (!ff)continue;
			else cout << "YES\n";
		}
	}

	return 0;
}

 题意

给定一串数字,其中只能交换相邻并且奇偶性不同的数字,求输出可得的最小数字

思路:

显然奇数只能和相邻的偶数交换,那么奇数的相对位置不可能发生改变,同理偶数也是一样,所有只需要分别按原数列排序,存储奇数和偶数,最后比较大小按顺序输出即可

 

int main()
{
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
#endif
	IO;
	int t; cin >> t;
	while (t--)
	{
		string s; cin >> s;
		vector<int> a, b;
		int sz = s.size();
		rep(i, 0, sz - 1)
		{
			int k = s[i] - '0';
			if (k & 1)
				a.push_back(k);
			else
				b.push_back(k);
		}
		int i = 0, j = 0;
		for (; i < a.size() && j < b.size();)
		{
			if (a[i] < b[j])
			{
				cout << a[i];
				i++;
			}
			else
			{
				cout << b[j];
				j++;
			}
		}
		while (j < b.size())cout << b[j],j++;
		while (i < a.size())cout << a[i],i++;
		cout << endl;
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值