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;
}