Submission #911617

#TimeUsernameProblemLanguageResultExecution timeMemory
911617The_SamuraiLamps (JOI19_lamps)C++17
4 / 100
753 ms14512 KiB
// I stand with PALESTINE




//#pragma GCC optimize("Ofast,O3")
//#pragma GCC target("avx,avx2")
#include "bits/stdc++.h"

using namespace std;
using ll = long long;

template<typename T> struct SegTree {
    vector<T> tree;
    int size;
    T neutral_element = 1e9; // sum - 0, mx - (-INF), mn - INF

    inline T merge(T a, T b) {
        return min(a, b);
    }

    void init(int n) {
        size = 1;
        while (size <= n) size *= 2;
        tree.assign(2 * size, neutral_element);
    }

    void build(vector<T> &a) {
        size = 1;
        while (size < a.size()) size *= 2;
        tree.assign(2 * size, neutral_element);
        for (int i = size; i < size + a.size(); i++) tree[i] = a[i - size];
        for (int i = size - 1; i > 0; i--) tree[i] = merge(tree[i << 1], tree[i << 1 | 1]);
    }

    void set(int p, T value) {  // set value at position p
        p += size;
        tree[p] = merge(value, tree[p]);
        for (; p > 1; p >>= 1) tree[p >> 1] = merge(tree[p], tree[p ^ 1]);
    }

    T get(int l, int r) {  // sum on interval [l, r]
        if (l > r) return neutral_element;
        T res = neutral_element;
        for (l += size, r += size + 1; l < r; l >>= 1, r >>= 1) {
            if (l & 1) res = merge(res, tree[l++]);
            if (r & 1) res = merge(res, tree[--r]);
        }
        return res;
    }
};


void solve() {
    int n;
    string s, t;
    cin >> n >> s >> t;
    s = "&" + s; t = "&" + t;
    auto find_ans = [&]() -> int {
        SegTree<int> sg; sg.init(n + 1);
        sg.set(0, 0);
        int l1 = 0, l2 = 0, eq = 0;
        for (int i = 1; i <= n; i++) {
            // teng emas
            if (s[i] != t[i]) l1++;
            else l1 = 0;
            if (l1) sg.set(i, sg.get(i - l1, i - 1) + 1);

            // hammasi teng
            if (s[i] == t[i]) eq++;
            else eq = 0;
            if (eq) sg.set(i, sg.get(i - eq, i - 1));

            // bir hil qib qo'yish
            if (t[i] == t[i - 1]) l2++;
            else l2 = 1;
            sg.set(i, sg.get(i - l2, i - 1) + 1);

//            cout << i << ' ' << sg.get(i, i) << endl;
        }
        return sg.get(n, n);
    };
    int ans = find_ans();
    for (int i = 1; i <= n; i++) s[i] ^= 1;
    ans = min(ans, find_ans() + 1);
    s = "&" + string(n, '0');
    ans = min(ans, find_ans() + 1);
    s = "&" + string(n, '1');
    ans = min(ans, find_ans() + 1);
    cout << ans;
}

int main() {
    cin.tie(0)->sync_with_stdio(false);
#ifdef sunnatov
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    int q = 1;
//    cin >> q;
    while (q--) {
        solve();
        cout << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...