Codeforces Round #550 (Div. 3) E. Median String
题意:给你两个字符串,保证他们两个之间有奇数个字典序大于第一个,小于第二个字符串的串,求这两个字符串的最中间的字符串。
1、考虑先求出两个字符串的差值,然后将差值/2,然后加上第一个字符串。
2、中间会出现负数,然后从后往前扫一遍,发现负数向前拿一位消掉负数。
3、会爆char类型,提前吧字符串转化为int类型的数字。
4、答案 = 差值/2+第一个串。
Code:
#include <bits/stdc++.h>
using namespace std;
int s1[200005], s2[200005];
int cha[200005];
char ch;
int main()
{
int n;
scanf("%d\n", &n);
for (int i = 0; i < n; i++)
{
ch = getchar();
s1[i] = ch - 'a';
}
getchar();
for (int i = 0; i < n; i++)
{
ch = getchar();
s2[i] = ch - 'a';
}
for (int i = 0; i < n; i++)
cha[i] = s2[i] - s1[i];
for (int i = n - 1; i > 0; i--)
{
if (cha[i] < 0)
{
cha[i] += 26;
cha[i - 1]--;
}
}
for (int i = 0; i < n; i++)
{
if (cha[i] & 1)
cha[i + 1] += 26;
cha[i] /= 2;
s1[i] += cha[i];
}
for (int i = n - 1; i >= 0; i--)
{
if (s1[i] >= 26)
{
s1[i - 1] += s1[i] / 26;
s1[i] = s1[i] % 26;
}
}
for (int i = 0; i < n; i++)
printf("%c", 'a' + s1[i]);
}