当前位置: 代码迷 >> 综合 >> 【Codeforces Round #526 (Div. 2) E. The Fair Nut and Strings】 思维题+Xor树
  详细解决方案

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

热度:68   发布时间:2023-12-29 02:18:08.0

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;
}
  相关解决方案