CF1084 E. The Fair Nut and Strings(思维)
目录
Description
给出两个长度为 \(n\) 的字符串,从这两个字符串找出 \(k\) 个字符串,使得这 \(k\) 个字符串拥有的前缀最多
State
\(1<=k<=10^9\)
\(1<=n<=5*10^{5}\)
Input
2 4
aa
bb
3 3
aba
bba
4
abbb
baaa
Output
6
8
8
Solution
题目能够想到字典树其实就好解决了
\[a \qquad b \\
a \quad b \qquad a \quad b \\
a \quad b \quad a \quad b \quad a \quad b \quad a \quad b
\]
用上图来解决样例二,第一层可以选 \(a, \ b\),第二层可以选 \(b,\ a,\ b\),第三层可以选 \(a,\ b,\ a, \ b,\ a\),同时最多选择 \(k\) 个,维护一下每一层所对应的区间,答案就出来了
Code
signed main()
{
//IOS;
string s, t;
while(cin >> n >> k){
cin >> s >> t;
ll l = 1, r = 1, ans = 0;
int flag = -1;
for(int i = 0; s[i]; i ++){
l = l * 2, r = r * 2;
if(s[i] == 'a') l --;
if(t[i] == 'a') r --;
ans += min((ll)k, (r - l + 1));
if((r - l + 1) >= k){
flag = i;
break;
}
}
if(flag != -1) ans += (s.size() - 1 - flag) * k;
pll(ans);
}
//PAUSE;
return 0;
}

浙公网安备 33010602011771号