AtCoder Regular Contest 154 -- B - New Place(二分答案)

题目如下:

AtCoder Regular Contest 154 -- B - New Place(二分答案)_第1张图片

题目简说:

通过重复将字符串开头的字符移动到所需位置的操作,我们希望找到与目标字符串匹配的最小操作数。

Sample Input 1

4
abab
abba

Sample Output 1

2

Sample Input 2

3
arc
cra

Sample Output 2

2

题解 or 思路:

假设我们执行了 k k k 次操作, 那我们按道理是可以保证 前 k k k 个字符放到最优(正确)的位置,然后我们检查后边的字符是否可以成功匹配。如果可以,那操作 k k k 次就可以满足题意。
我们可以通过 二分答案 去求解答案。

AC 代码如下:

/*
Make it simple and keep self stupid
author:Joanh_Lan
*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define buff                     \
    ios::sync_with_stdio(false); \
    cin.tie(0);
// #define int long long
#define ll long long
#define PII pair<int, int>
#define px first
#define py second
typedef std::mt19937 Random_mt19937;
Random_mt19937 rnd(time(0));
using namespace std;
const int mod = 1e9 + 7;
const int inf = 2147483647;
const int N = 100009;
// int Mod(int a,int mod){return (a%mod+mod)%mod;}
// int lowbit(int x){return x&-x;}//最低位1及其后面的0构成的数值
// int qmi(int a, int k, int p){int res = 1 % p;while (k){if (k & 1) res = Mod(res * a , p);a = Mod(a * a , p);k >>= 1;}return res;}
// int inv(int a,int mod){return qmi(a,mod-2,mod);}
// int lcm(int a,int b){return a*b/__gcd(a,b);}
int n;
string a, b;
char st[30];
void solve()
{
    cin >> n;
    cin >> a >> b;
    for (int i = 0; i < n; i++)
        st[a[i] - 'a']++, st[b[i] - 'a']--;
    for (int i = 0; i < 26; i++)
    {
        if (st[i])
        {
            cout << -1 << '\n';
            return;
        }
    }
    auto check = [](int x)
    {
        for (int i = 0; i < n; i++)
            if (x < n && b[i] == a[x])
                x++;
            return x == n;
    };
    int l = 0, r = n;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid))
            r = mid;
        else
            l = mid + 1;
    }
    cout << r << '\n';
}
int main()
{
    buff;
    solve();
}

你可能感兴趣的:(练习,c++,算法,AtCoder,二分,二分答案)