题意:在所有长度为n,字典序在s和t的,只有'a','b'组成的字符串中,选取k个,然后让他们前缀组成的集合最大。
思路:如果我们把字符二叉树画出来,一个字符串对应根到叶子的一条路径。
我们发现如果某一层的节点数比k小,那么这一层的节点都可以被经过。按照题意处理即可。
#include<bits/stdc++.h>
#define maxn 500010
using namespace std;
typedef long long LL;
LL n,k;
char a[maxn],b[maxn];
LL res,ans;
int main(){
scanf("%d%d%s%s",&n,&k,a+1,b+1);
res = 1;
for(int i=1;i<=n;i++){
res*=2; //每一层的节点数
if(a[i]=='b') res--;
if(b[i]=='a') res--;
if(res>1E9) res=1E9;
ans += min(res,k);
}
cout<<ans<<endl;
return 0;
}

京公网安备 11010502036488号