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;
}