比賽時A了。。。
以下轉自出題人解析:
當字符串長度爲2時:直接模擬即可(最多26次)。
當字符串長度大於2時:
1. 定義字符串的奇偶性爲該字符串所有字符之和的奇偶性。
2. 因爲每次變化操作字符串的字符和共增加了2,所以當字符串的奇偶
性不同時答案一定爲N O。
3. 當字符串的奇偶性相同時可證明答案一定爲Y ES,證明如下:
對於任意3個位置的字符(x1 , x2 , x3 ),可進行如下變化:
(x1 , x2 , x3 ) → (x1 , x3 + 1, x2 + 1) → (x2 + 2, x3 + 1, x1 + 1) → (x2 +
2, x1 + 2, x3 + 2) → (x1 + 3, x2 + 3, x3 + 2).(記爲變化方式1)。
在變化方式1的基礎上,再將這3個位置的字符兩兩各交換12次,即
得(x1 + 3 + 12 + 12, x2 + 3 + 12 + 12, x3 + 2 + 12 + 12)即(x1 + 27, x2 +
27, x3 + 26)(記爲變化方式2)。
又 一 共 只 有26個 小 寫 字 母 , 所 以 變 化 方 式 2 等 同 於(x1 , x2 , x3 ) →
(x1 + 1, x2 + 1, x3 )。即保證了不改變字符位置順序的情況下對兩
個字符進行了+1操作。
所以每次我們只需任選和S2 該位置不相同的兩個位置的字符進行變化
方式2的操作,那麼最後要麼S1 完全變爲S2 ,要麼S1 和S2 只有一個位
置的字符不相同,對於只有一個位置字符不相同的情況,因爲字符串
奇偶性相同,所以可進行變化1的操作使得該位置的差值平攤到另外
兩個位置,再對這另外兩個位置進行變化2的操作即得到了S2
#include <iostream>
#include <string>
using namespace std;
string s1, s2;
bool f()
{
for (int i=0;i<26;++i)
{
if (s1[0]==s2[0] && s1[1]==s2[1])
return true;
swap(s1[0], s1[1]);
s1[0]++, s1[1]++;
if (s1[0]>'z') s1[0] = 'a';
if (s1[1]>'z') s1[1] = 'a';
}
return false;
}
int main()
{
int t, i, j, k, l, n, m, c = 0;
scanf("%d", &t);
while (t--)
{
cin>>s1>>s2;
printf("Case #%d: ", ++c);
l = s1.length();
n = m = 0;
if (l>2)
{
for (i=0;i<l;++i)
{
n += s1[i];
m += s2[i];
}
if ((n&1) == (m&1)) printf("YES\n");
else printf("NO\n");
}
else
{
if (f()) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}