E. Median String
题意
给一个字符串a,字符串b,要输出字符串c,字符串c是a,b按字典序的中位(b字典序一定比a大奇数)
解析:
c=(a+b)/2,模拟26进制大数加法和除法
ac:
#include<bits/stdc++.h>
#define MAXN 400005
using namespace std;
int n;
char str[MAXN],ctr[MAXN],gtr[MAXN];
int a[MAXN],b[MAXN],c[MAXN];
int main()
{
scanf("%d",&n);
scanf("%s%s",&str,&ctr);
for(int i=n-1;i>=0;i--)
{
a[i]=str[i]-'a';
b[i]=ctr[i]-'a';
}
for(int i=n-1;i>=0;i--)
{
c[i]+=a[i]+b[i];
if(i)
{
c[i-1]+=c[i]/26;
c[i]=c[i]%26;
}
}
for(int i=0;i<n;i++)
{
int ret=c[i]%2;
c[i]=c[i]/2;
if(ret&&i!=n-1)
c[i+1]+=ret*26;
gtr[i]='a'+c[i];
}
for(int i=0;i<n;i++)
printf("%c",gtr[i]);
printf("\n");
return 0;
}
c=a+(b-a)/2
ac:
#include<bits/stdc++.h>
#define MAXN 400005
using namespace std;
int n;
char str[MAXN],ctr[MAXN];
int a[MAXN];
int main()
{
scanf("%d",&n);
scanf("%s%s",&str,&ctr);
for(int i=n-1;i>=0;i--)
{
a[i]+=ctr[i]-str[i];
if(a[i]<0&&i)
a[i-1]--,a[i]+=26;
}
for(int i=0;i<n;i++)
{
int ret=abs(a[i]%2);
a[i]/=2;
if(i!=n-1)
a[i+1]+=ret*26;
}
for(int i=n-1;i>=0;i--)
{
if(i&&a[i]+str[i]-'a'>=26)
a[i]-=26,a[i-1]+=1;
}
for(int i=0;i<n;i++)
printf("%c",str[i]+a[i]);
printf("\n");
return 0;
}