Submission #1203927

#TimeUsernameProblemLanguageResultExecution timeMemory
1203927jioungNecklace (Subtask 4) (BOI19_necklace4)C++20
0 / 15
194 ms636 KiB
#include <bits/stdc++.h>
#include <tuple>
using namespace std;

#define int long long
#define fi first
#define se second
#define NAME ""
#define eb emplace_back
#define pii pair<int, int>
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
#define REP(i, a, b) for (int i = (a), _b = (b); i >= _b; i--)
#define FORD(i, a, b, x) for (int i = (a), _b = (b); i <= _b; i += x)

const int MAX = 6005, BLOCK = sqrt(MAX) + 1, LOG = __lg(MAX) + 1, mod = 1e9 + 7;
const int INF = 1e18;
typedef long long ll;

namespace Solution
{
    string s, t;
    int p1[MAX], p2[MAX];
    void fill(string s, int *p)
    {
        FOR(i, 1, s.size() - 1)
        {
            int j = p[i - 1];
            while (j > 0 && s[i] != s[j])
                j = p[j - 1];
            if (s[i] == s[j])
                j++;
            p[i] = j;
        }
    }
    void solve()
    {
        cin >> s >> t;
        function<tuple<int, int, int>(string, string, bool)> f = [&](string s, string t, bool rev)
        {
            int n = s.size(), m = t.size();
            tuple<int, int, int> res = {0, 0, 0};
            FOR(i, 0, n - 1)
            {
                string s1 = s.substr(0, i), s2 = s.substr(i, n - i);
                reverse(s1.begin(), s1.end());
                string t1 = t, t2 = t;
                reverse(t2.begin(), t2.end());
                fill(s1 + "#" + t1, p1), fill(s2 + "#" + t2, p2);
                FOR(j, 1, m)
                {
                    res = max(res, {p1[i + j] + p2[n + m - i - j], i - p1[i + j],
                                    rev ? m - j - p2[n + m - i - j] : j - p1[i + j]});
                }
            }
            return res;
        };
        tuple<int, int, int> res = f(s, t, false);
        reverse(t.begin(), t.end());
        res = max(res, f(t, s, true));
        cout << get<0>(res) << '\n'
             << get<1>(res) << ' ' << get<2>(res);
    }
}

signed main()
{
    if (fopen(NAME ".inp", "r"))
    {
        freopen(NAME ".inp", "r", stdin);
        freopen(NAME ".out", "w", stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
    // cin >> T;
    while (T--)
    {
        Solution::solve();
    }
    return 0;
}

Compilation message (stderr)

necklace.cpp: In function 'int main()':
necklace.cpp:69:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |         freopen(NAME ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
necklace.cpp:70:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |         freopen(NAME ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...