链接:Codeforces 1006D - Two Strings Swaps
大意:给你两个长度为n的字符串a,b,你可以进行下列三种操作:1.调换a,b相同位置的字符;2.调换a串中对称位置的字符;3.调换b串中对称位置的字符。在进行这三种操作之前,你可以进行预处理的操作,即对a串中某些位置的字符串进行替换。求至少进行多少次预处理之后,可以通过上述三种操作使得a串等于b串。
思路:思维题,三种操作实际上实现的是将a、b串中相同位置和对称位置的字符(a[i],b[i],a[n-i-1],b[n-i-1])进行随意交换,所以只要考虑每个位置对应4个字符的情况即可,若不可通过交换使该位置相等,则:1.若4个字符各不相同,则至少需要进行2次替换;2.若4个字符中有3个不同,即有2个字符相同,考虑如果这2个相同字符均属于b串,此时无法通过1次替换使得a、b串相等,必须进行2次,此外只需1次替换即可;3.若4个字符有2个不同,此时只需进行1次替换即可。统计一共所需交换的次数输出即可。注意:字符串长度为奇数时记得判断中间位置两个字符是否相等。
代码:
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
char *a, *b;
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int res = 0;
a = new char[n + 1];
b = new char[n + 1];
scanf("%s%s", a, b);
res = n % 2 ? a[n / 2] != b[n / 2] : 0;
for (int i = 0; i < n / 2; i++)
{
if (a[i] == a[n - i - 1] && b[i] == b[n - i - 1])
continue;
else if (a[i] == b[i] && a[n - i - 1] == b[n - i - 1])
continue;
else if (a[i] == b[n - i - 1] && a[n - i - 1] == b[i])
continue;
else
{
set<char> diff;
diff.insert(a[i]);
diff.insert(b[i]);
diff.insert(a[n - i - 1]);
diff.insert(b[n - i - 1]);
switch (diff.size())
{
case 2:
res++;
break;
case 3:
res++;
if (a[i] == a[n - i - 1])
res++;
break;
case 4:
res += 2;
break;
default:
break;
}
}
}
printf("%d\n", res);
}
return 0;
}