【Codeforces Round #526 (Div. 2) E. The Fair Nut and Strings】 思维题+Xor树

35 篇文章 1 订阅
17 篇文章 3 订阅

E. The Fair Nut and Strings

题意

给你两个只含ab的长度为n的字符串,让你在字典序在这两个之间的字符串中找出k个字符串,使这k个字符串有最多的不同前缀,输出不同的前缀个数。

做法

把ab考虑为01,而且还要考虑前缀,很显然可以想到01字典树
我们把字典树画出来一看,
在这里插入图片描述
如果我们要查011和110之间的字符串,我们发现就是这样一个区域
在这里插入图片描述
很明显我们只要统计每个长度的前缀有多少种就可以,
也就是从第一层开始每一层有多少个节点,选的时候尽量选层数靠后的就可以
最开始的写法不太好写,后来优化了一下就变成了下面这么短
代码

#include<stdio.h>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 5e5+5;
char str1[maxn],str2[maxn];
int main()
{
    int n,k;
    scanf("%d%lld",&n,&k);
    scanf("%s",str1);
    scanf("%s",str2);
    ll ans=0,pre=0;
    for(int i=0;i<n;i++)
    {
        pre=min(pre*2+(int)(str2[i]-str1[i]),1LL<<40);
        ans+=min(pre+1,(ll)k);
    }
    printf("%lld\n",ans);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值