답안 #584508

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
584508 2022-06-27T13:32:19 Z tengiz05 Necklace (Subtask 1-3) (BOI19_necklace1) C++17
17 / 85
1128 ms 540 KB
#include <bits/stdc++.h>

using i64 = long long;
using namespace std;

int min_cyc(const string &s) {
    int n = s.size();
    int res = 0;
    for (int l = 0; l < n; ){
        res = l;
        int r = l, p = l + 1;
        for (; r < n; ++r, ++p) /// If there is such string found, then its length wont exceed |s|
        {
            char c = (p < n) ? s[p] : s[p - n]; /// to avoid modulo
            if (s[r] > c) break;
            if (s[r] < c) r = l - 1;
        }        
        l = max(r, l + p - r); /// just skip those (s2 = sx + sx + ... + sx + sy) cases
    }
    return res;
}


struct Hash {
    static constexpr i64 P = 1E12 + 7, M = 29;
    int n;
    i64 x;
    Hash(std::string s) : n(s.size()) {
        x = 0;
        for (int i = 0; i < n; i++)
            x = (1LL * x * M + (s[i] - 'a' + 1)) % P;
    }
    i64 get(int l, int r) {
        return x;
    }
};

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    string a, b;
    cin >> a >> b;
    
    int lo = 0, hi = std::min(a.size(), b.size()) + 1;
    
    auto work = [&](string a, int x) {
        int n = a.size();
        
        vector<pair<i64, int>> b;
        for (int i = 0; i <= n - x; i++) {
            string s = a.substr(i, x);
            int p = min_cyc(s);
            rotate(s.begin(), s.begin() + p, s.end());
            b.emplace_back(Hash(s).get(0, x), i);
            // reverse(s.begin(), s.end());
            // p = min_cyc(s);
            // rotate(s.begin(), s.begin() + p, s.end());
            // b.emplace_back(Hash(s).get(0, x), i);
        }
        
        sort(b.begin(), b.end());
        return b;
    };
    
    auto get = [&](int len) -> pair<int, int> {
        auto x = work(a, len);
        auto y = work(b, len);
        
        int i = 0;
        
        for (auto [a, b] : x) {
            while (i + 1 < int(y.size()) && y[i].first < a) i++;
            if (y[i].first == a) {
                return {b, y[i].second};
            }
        }
        
        return {-1, -1};
    };
    
    while (lo + 1 < hi) {
        int m = (lo + hi) / 2;
        if (get(m).first != -1) {
            lo = m;
        } else {
            hi = m;
        }
    }
    
    auto g = get(lo);
    array<int, 3> ans{lo, g.first, g.second};
    lo = 0, hi = min(a.size(), b.size()) + 1;
    reverse(b.begin(), b.end());
    while (lo + 1 < hi) {
        int m = (lo + hi) / 2;
        if (get(m).first != -1) {
            lo = m;
        } else {
            hi = m;
        }
    }
    
    g = get(lo);
    array<int, 3> res{lo, g.first, int(b.size()) - g.second - lo};
    
    ans = max(ans, res);
    
    cout << ans[0] << "\n";
    cout << ans[1] << " " << ans[2] << "\n";
    
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Partially correct 1 ms 212 KB Output is partially correct
3 Correct 2 ms 212 KB Output is correct
4 Partially correct 2 ms 212 KB Output is partially correct
5 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Partially correct 1 ms 212 KB Output is partially correct
3 Correct 2 ms 212 KB Output is correct
4 Partially correct 2 ms 212 KB Output is partially correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 9 ms 324 KB Output is correct
7 Partially correct 13 ms 328 KB Output is partially correct
8 Correct 12 ms 340 KB Output is correct
9 Partially correct 11 ms 344 KB Output is partially correct
10 Partially correct 10 ms 340 KB Output is partially correct
11 Partially correct 8 ms 340 KB Output is partially correct
12 Correct 13 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Partially correct 1 ms 212 KB Output is partially correct
3 Correct 2 ms 212 KB Output is correct
4 Partially correct 2 ms 212 KB Output is partially correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 9 ms 324 KB Output is correct
7 Partially correct 13 ms 328 KB Output is partially correct
8 Correct 12 ms 340 KB Output is correct
9 Partially correct 11 ms 344 KB Output is partially correct
10 Partially correct 10 ms 340 KB Output is partially correct
11 Partially correct 8 ms 340 KB Output is partially correct
12 Correct 13 ms 344 KB Output is correct
13 Correct 780 ms 400 KB Output is correct
14 Partially correct 685 ms 400 KB Output is partially correct
15 Correct 512 ms 500 KB Output is correct
16 Partially correct 561 ms 512 KB Output is partially correct
17 Partially correct 506 ms 540 KB Output is partially correct
18 Partially correct 308 ms 500 KB Output is partially correct
19 Correct 1128 ms 420 KB Output is correct
20 Correct 832 ms 516 KB Output is correct
21 Correct 684 ms 484 KB Output is correct