codeforces1144E(二十六进制)E. Median String

E. Median String

题目大意

给出长度为k的两个字符串s和t
保证t的字典序大于s
然后找出字典序在s和t正中央的字符串

题目分析

这个题目其实很好想,就把字符串当成26进制的,然后求其加和在求其平均值,当然加法和除法都是二十六进制的 a代表0,z代表25。
又因为保证有奇数个字符串不小于s,也不大于t,所以在给出的s的基础上加上1,就能保证最后的和是偶数。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
#define mkp(a,b) make_pair(a,b)
#define pii pair<int,int>
#define mem0(a) memset(a,0,sizeof(a))
#define mem(a,b) memset(a,b,sizeof(a))
const int INF = 0x3f3f3f3f ;
const int maxn = 210000;
const double pi = acos(-1.0);
int k;
char s[maxn],t[maxn];
char ss[maxn];
short num[maxn];
void add(char *a,char *b)//二十六进制加法
{
    int len=k;
    int carry=0;//进位标志
    for(int i=len;i>=0;i--)//从后向前算,也就是从低位向高位计算
    {
        int temp=carry+a[i]+b[i]-'a'-'a';//把两个字符串相应位置上的数像加
        a[i]=temp%26+'a';//计算当前位
        carry=temp/26;//更新进位标志
    }
    for(int i=0;i<=len;i++)
    {
        num[i]=a[i]-'a';
    }
}
void chu()//二十六进制求其平均值
{
    short carry=num[0];
    for(int i=1;i<=k;i++)
    {
        short temp=carry*26+num[i];
        num[i]=temp/2;
        carry=temp-num[i]*2;
    }
}
int main()
{
    cin>>k;
    scanf("%s%s",s+1,t+1);//为了避免两个字符串的最高位相加后溢出,要在其开头都加上一个0也就是a
    s[0]=t[0]='a';
    for(int i=0;i<k;i++)ss[i]='a';
    ss[k]='b';
    add(s,ss);//加1
    add(s,t);//s和t像加
    chu();//求平均值
    for(int i=1;i<=k;i++)
    cout<<char(num[i]+'a');
    cout<<endl;
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值