#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i < (b); ++i)
#define per(i, a, b) for (int i = (int)(b) - 1; i >= (a); --i)
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define sz(x) (int)(x).size()
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vii = vector<pii>;
using vb = vector<bool>;
using vl = vector<ll>;
vi pi(const string &s) {
vi p(sz(s));
rep(i, 1, sz(s)) {
int g = p[i - 1];
while (g && s[i] != s[g]) g = p[g - 1];
p[i] = g + (s[i] == s[g]);
}
return p;
}
tuple<int, int, int> solve(const string &s, const string &t) {
const int n = sz(s), m = sz(t);
tuple<int, int, int> ans = {0, 0, 0};
rep(i, 0, n) {
string s1 = s.substr(0, i), s2 = s.substr(i, n - i);
string t1 = t, t2 = t;
reverse(all(s1)), reverse(all(t2));
const auto p = pi(s1 + '$' + t1), q = pi(s2 + '$' + t2);
rep(j, 1, m + 1) {
int lhs = p[i + j], rhs = q[(n - i) + (m - j)];
ans = max(ans, tuple(lhs + rhs, i - lhs, j - lhs));
}
}
return ans;
}
int main() {
cin.tie(0)->sync_with_stdio(0);
string s, t;
cin >> s >> t;
auto normal = solve(s, t);
reverse(all(t));
auto reversed = solve(s, t);
get<2>(reversed) = get<0>(reversed) + get<2>(reversed) - 1;
get<2>(reversed) = sz(t) - get<2>(reversed) - 1;
auto [x, y, z] = max(normal, reversed);
cout << x << '\n' << y << ' ' << z << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |