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;
}
posted @ 2021-08-26 09:09  Bcoi  阅读(57)  评论(0)    收藏  举报