| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 396511 | KoD | Necklace (Subtask 4) (BOI19_necklace4) | C++17 | 239 ms | 452 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using i32 = std::int32_t;
using u32 = std::uint32_t;
using i64 = std::int64_t;
using u64 = std::uint64_t;
using i128 = __int128_t;
using u128 = __uint128_t;
using isize = std::ptrdiff_t;
using usize = std::size_t;
class rep {
    struct Iter {
        usize itr;
        constexpr Iter(const usize pos) noexcept : itr(pos) {}
        constexpr void operator++() noexcept { ++itr; }
        constexpr bool operator!=(const Iter& other) const noexcept {
            return itr != other.itr;
        }
        constexpr usize operator*() const noexcept { return itr; }
    };
    const Iter first, last;
  public:
    explicit constexpr rep(const usize first, const usize last) noexcept
        : first(first), last(std::max(first, last)) {}
    constexpr Iter begin() const noexcept { return first; }
    constexpr Iter end() const noexcept { return last; }
};
template <class T> bool setmax(T& lhs, const T& rhs) {
    if (lhs < rhs) {
        lhs = rhs;
        return true;
    }
    return false;
}
template <class T> using Vec = std::vector<T>;
Vec<usize> knuth_morris_pratt(const std::string& S) {
    const auto N = S.size();
    Vec<usize> ret(N + 1);
    ret[0] = -1;
    usize j = -1;
    for (const auto i : rep(0, N)) {
        while ((~j) and S[i] != S[j]) {
            j = ret[j];
        }
        j += 1;
        ret[i + 1] = j;
    }
    ret[0] = 0;
    return ret;
}
std::tuple<usize, usize, usize> solve(const std::string& S,
                                      const std::string& T,
                                      const std::string& revT) {
    const auto N = S.size();
    const auto M = T.size();
    std::tuple<usize, usize, usize> ret(0, 0, 0);
    for (const auto split : rep(0, N + 1)) {
        const auto s1 = S.substr(0, split);
        const auto s2 = S.substr(split, N - split);
        const auto A = knuth_morris_pratt(std::string(s1.rbegin(), s1.rend()) +
                                          '$' + revT);
        const auto B = knuth_morris_pratt(s2 + '$' + T);
        for (const auto k : rep(0, M + 1)) {
            const auto b = A[A.size() - k - 1];
            const auto f = B[s2.size() + 1 + k];
            setmax(ret, std::make_tuple(b + f, split - f, k - f));
        }
    }
    return ret;
}
void BOI19_Necklace_main() {
    std::string S, T;
    std::cin >> S >> T;
    const auto revT = std::string(T.rbegin(), T.rend());
    const auto [a1, i1, j1] = solve(S, T, revT);
    const auto [a2, i2, j2] = solve(S, revT, T);
    if (a1 > a2) {
        std::cout << a1 << '\n';
        std::cout << i1 << ' ' << j1 << '\n';
    } else {
        std::cout << a2 << '\n';
        std::cout << i2 << ' ' << T.size() - (a2 + j2) << '\n';
    }
}
int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    BOI19_Necklace_main();
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
